Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Был, сегодня, на собеседовании   Найти похожие ветки 

 
ikivio   (2004-04-23 00:01) [0]

Если вы создаете свой класс, то, как не допустить создание
Его второго экземпляра ?
( без глобальной переменной, и перехода типа: if … then Create )


 
ikivio   (2004-04-23 00:12) [1]

Забыл добавить фразу: Засыпался на вопросе:


 
VMcL ©   (2004-04-23 00:12) [2]

CreateMutex + вместо if Condition then DoSome:
While Condition do
begin
 DoSome;
 Break;
end;


 
ikivio   (2004-04-23 00:16) [3]

На мою первую фразу: митех - ответ: в пределах одного
exe file


 
Suntechnic ©   (2004-04-23 00:33) [4]

Singleton pattern эта штука называется. Любимейший вопрос на любом интервью по любому из языков программирования.


 
ikivio   (2004-04-23 00:37) [5]

Да..., и еще:
Когда идет попытка создания,
надо не создать новый, а перейти на уже созданный.
>Suntechnic
можно подробнее ?


 
Fantasist ©   (2004-04-23 00:44) [6]


> Singleton pattern эта штука называется.


 Называться-то она может и называеться, однако к реализации в ТАКИХ условиях она не приближает. Обычно все-таки учавствует некая глобальная переменная, для хранения созданного объекта.


 
Suntechnic ©   (2004-04-23 00:53) [7]

>ikivio
Подробности здесь:
http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=Singleton+pattern

Или поищи на форуме, здесь эта тема не раз обсуждалась.

>Fantasist ©
Я это к тому, что идя на интервью надо быть готовым к таким вопросам. Иногда вопрос может просто звучать Singleton pattern in .... (С++, Delphi, С# and etc.) и точка.

Честно говоря у человека не способного показать имплементацию этого паттерна очень мало шансов получить работу.


 
ikivio   (2004-04-23 00:56) [8]

>Fantasist
И, как можно ответить на этот вопрос ?


 
ikivio   (2004-04-23 01:06) [9]

>Suntechnic
Согласен.
 Но, не на все у тебя сразу готовы ответы.
 Если, ты этим не занимался, то можно слазить в Help и т.д.
 Т. е. дай - время - разберусь.


 
Fantasist ©   (2004-04-23 02:52) [10]


> Честно говоря у человека не способного показать имплементацию
> этого паттерна очень мало шансов получить работу.


 Еще раз обращаю внимание на условие. Имплементация не должна пользоваться глобальными переменными. Тогда как в обычной практике она все-таки используется. Вот и сядите вы в лужу с такой реализацией, хотя она и правильная в терминах Singleton pattern.


> И, как можно ответить на этот вопрос ?


 Возможно имеется ввиду константа в функции:


function TMObject.A:pointer;
const
 _global:pointer = nil;
begin
end;


 Вроде как по смыслу не глобальная переменная, а функцию может выполнять ту же.
 А далее, как тут уже обсуждалось - перекрыть NewInstance и FreeInstance.


 
SPeller ©   (2004-04-23 03:30) [11]

Товарищи, если я что-то не понимаю, то извините и скажите почему я не прав. Нафига извращаться с перекрытием методов, когда можно использовать глобальную переменную, невидимую в других модулях? Обозвать её вроде ___TMOBJECT_INSTANCE___ и всё, кому она такая помешает? Какой религии это противоречит?


 
Suntechnic ©   (2004-04-23 04:38) [12]

>Fantasist ©  
Еще раз обращаю внимание на условие. Имплементация не должна пользоваться глобальными переменными. Тогда как в обычной практике она все-таки используется. Вот и сядите вы в лужу с такой реализацией, хотя она и правильная в терминах Singleton pattern.

Да что ты заладил имплементация, имплементация... на собеседование много чего можно через одно место имплементировать и сесеть в то место куда ты указал.

На С++ тоже этот патерн так имплементировать, что только уборщиком на работу и возьмут. Одно дело знать что это вообще такое, а другое как это имплементировать.


 
шлшмшщ   (2004-04-23 08:00) [13]

>Suntechnic
Спасибо. Ссылка помогла.
Как говориться: знал бы - соломки подстелил


 
LaidBack   (2004-04-23 09:44) [14]

Ну и нафига такие извращения нужны в реальной жизни программеру? Я считаю основным достоинством программера - умение самомтоятельно находить нужное решение задачи, с помощью головы, help"a и internet. И если в данный момент я не знаю ответа на этот вопрос нельзя сказать, что я ламер, просто это мне нафиг не нужно было. Понадобится - узнаю :)


 
Игорь Шевченко ©   (2004-04-23 10:09) [15]


> Ну и нафига такие извращения нужны в реальной жизни программеру?
> Я считаю основным достоинством программера - умение самомтоятельно
> находить нужное решение задачи, с помощью головы


Ты сказал. (с) Евангелие

Насколько я понял, на собеседовании и предложили найти решение с помощью головы.


 
Kerk ©   (2004-04-23 10:16) [16]


> Игорь Шевченко ©   (23.04.04 10:09) [15]
> Насколько я понял, на собеседовании и предложили найти решение
> с помощью головы.

Так на собеседовании не разрешают на форуме спрашивать! :)


 
Леприкон ©   (2004-04-23 10:31) [17]

Если я не в тему, то извините меня грешного.
А гуманно ли выдавать при собеседовании белый лист бумаги и ручку. Мол, вот задание, пиши. А если я забыл какой либо компонент с закладки QReport (или вообще забыл название закладки) ибо им редко пользуюсь. И уж тем более не знаю всех его методов и свойств. Что, мои знания в Delphi равны 0? Если уж писать, то в редакторе кода. Code Insight ведь для чего то нужен?


 
mrcat ©   (2004-04-23 10:34) [18]

>А если я забыл какой либо компонент с закладки QReport
>И уж тем более не знаю всех его методов и свойств
А что, такое требуют при собеседовании ? :)


 
Тимохов ©   (2004-04-23 10:41) [19]

если бы с глобальной переменной, то я бы через newinstance сделал
типа такого

var
  kO: TObj;

class function TObj.NewInstance: TObject;
begin
  if kO <> nil then
     result := kO
  else
  begin
     result := Inheried;
     kO := result;
  end;
end;


Уточнил бы еще - нужно ли это все потокобезопасно или все в рамках одного потока.
Не забыл бы, конечно, про freeinstance.

Без гл. переменной - не знаю.


 
Леприкон ©   (2004-04-23 10:43) [20]


> mrcat ©   (23.04.04 10:34) [18]


Да, личный опыт. Просили сделать небольшой отчёт в QReport. Ограничеие по времени 10 мин. Я не долго думая поставил рядом жирный прочерк.


 
Rule ©   (2004-04-23 10:44) [21]

Kerk ©   (23.04.04 10:16) [16]

Тогда получилось бы что на собеседование не он проходит а весь форму, и я думаю мы бы прорвались :), хоть к самому Билу Гейтсу :)


 
Тимохов ©   (2004-04-23 10:45) [22]


>  хоть к самому Билу Гейтсу :)

с паскалем, как  же...


 
Игорь Шевченко ©   (2004-04-23 11:06) [23]

Тимохов ©   (23.04.04 10:41)

Представь, что ты вызвал два раза конструктор такого объекта, результат присвоил двум разным переменным. Один раз вызвал ПерваяПеременная.Free. На что будет указывать вторая переменная ?


 
Тимохов ©   (2004-04-23 11:12) [24]


> Игорь Шевченко ©   (23.04.04 11:06) [23]

К чему вопрос?
От автора поста требовали написать класс не позволяющий создавать второй экземпляр.
Вроде задача выполнена.
Можно конечно в newinstance генерить exception если создается второй экземпляр, но это уже зависит от задачи - не пущать или подставлять первый вариант.

Вы приводите дальнейшее условие задачи?


 
Dmitriy O. ©   (2004-04-23 11:41) [25]


> Леприкон ©   (23.04.04 10:43)
"Программер можешь ты не быть но Qreport ты знать обязан"
(с) Мое


 
Игорь Шевченко ©   (2004-04-23 11:50) [26]

Тимохов ©   (23.04.04 11:12)

И все-таки, на что будет указывать вторая переменная ? :)


 
Паниковский ©   (2004-04-23 11:58) [27]

Игорь Шевченко
на туда на что угодно
ну и ?


 
Тимохов ©   (2004-04-23 12:03) [28]


> И все-таки, на что будет указывать вторая переменная ? :)

чую, что подхов какой-то :))
но вроде, на что и указывала :)
только объекта по этому адресу уже не будет.


 
Игорь Шевченко ©   (2004-04-23 13:05) [29]

Тимохов ©   (23.04.04 12:03)

А написать примерчик, и проверить ? :) 5 минут ведь потребуется.

> только объекта по этому адресу уже не будет.


И что получится при попытке обращения к объекту по указателю во воторой переменной ? :)


 
ikivo   (2004-04-23 13:21) [30]

Только сейчас вошел в интернет.
Всем спасибо !
>Тимохов
>Вы приводите дальнейшее условие задачи?
При создании нового он должен не создасться,
а перевести "стрелки" на уже созданный.


 
Layner ©   (2004-04-23 13:24) [31]

Это на какую работу искали спеца, если не секрет, в каком городе, и что надо было делать?


 
ikivio   (2004-04-23 13:37) [32]

>Layner ©   (23.04.04 13:24) [31]
>Это на какую работу искали спеца, если не секрет, в каком >городе, и что надо было делать?
Petersbug
программист, "знающий Delphi"
>делать
переделывать чужой код


 
Layner ©   (2004-04-23 13:48) [33]

Уууу ... переделывать ... не, ищи лучше работу в другом месте. В Питере спрос вроде высокий на IT специалистов...
программист, "знающий Delphi"
Если про среду разработаки, то может версию указали? А про ООП зачем спрашивают? Нафиг такая работа, одним словом, там наверняка ещё стеклянная стена, и все мониторы видно начальником, который сидит за стекл. стеной и следит 8 часов, чем занимаются сотрудники...


 
ikivio   (2004-04-23 13:58) [34]

>Layner
>ищи лучше работу в другом месте
$1300 - убеждает
Да я не для разборок создал веку.
Просто обидно.
Ну, не знаю - "дай - время - разберусь."


 
Тимохов ©   (2004-04-23 14:04) [35]


> Игорь Шевченко ©   (23.04.04 13:05) [29]


type
  TClassX = class
     public procedure Change(); virtual; // чтобы не был статическим
     public class function NewInstance: TObject; override;
  end;

procedure TClassX.Change();
begin
  ShowMessage("hi");
end;

var
  kObjectX: TClassX = nil;

class function TClassX.NewInstance: TObject;
begin
  if kObjectX = nil then kObjectX := TClassX(inherited NewInstance);
  Result := kObjectX;
end;

procedure TForm1.Button19Click(Sender: TObject);
var
  kO1, kO2: TClassX;
begin
  kO1 := TClassX.Create();
  kO2 := TClassX.Create();
  kO1.Free();
  kO2.Change(); // <- av
end;


av есть, как и следовало ожидать.
как этого избежать, т.е. не давать уничтожать объект, если на него кто-то смотрит?
пока не знаю - надо подумать.
в чем вопрос то?


 
Locker   (2004-04-23 14:21) [36]

constructor TMyClass.Create;
const
 Created: boolean = false;
begin
 if (Created) then raise Exception.Create("Экземпляр класса уже создан");
 ...
 boolean((@Created)^) := true;
end;


 
Тимохов ©   (2004-04-23 14:23) [37]


> Locker   (23.04.04 14:21) [36]

вроде по уточненному уловию надо не отлуп дать а тихо подменить старым значением.


 
Игорь Шевченко ©   (2004-04-23 14:26) [38]

unit HSSingleton;

interface

type
 THSSingleton = class
 private
   FInstanceCount: Integer;
 public
   class function NewInstance: TObject; override;
   procedure FreeInstance; override;
 end;

implementation
uses
 Windows;

{ THSSingleton }

var
 Instance: THSSingleton;
 CritSect: RTL_CRITICAL_SECTION;

procedure THSSingleton.FreeInstance;
begin
 EnterCriticalSection(CritSect);
 try
   Dec(FInstanceCount);
   if FInstanceCount = 0 then begin
     inherited;
     Instance := nil;
   end;
 finally
   LeaveCriticalSection(CritSect);
 end;
end;

class function THSSingleton.NewInstance: TObject;
begin
 EnterCriticalSection(CritSect);
 try
   if not Assigned(Instance) then
     Instance := THSSingleton(inherited NewInstance);
   Result := Instance;
   Inc(Instance.FInstanceCount);
 finally
   LeaveCriticalSection(CritSect);
 end;
end;

initialization
 InitializeCriticalSection(CritSect);
finalization
 DeleteCriticalSection(CritSect);
end.


Глобальных переменных нет, есть локальные для модуля.


 
Тимохов ©   (2004-04-23 14:38) [39]


> Игорь Шевченко ©   (23.04.04 14:26) [38]

Можно замечание?
У вас все верно.
Т.е. заявленную функциональность класс делает - не дает созадать следующую копию.

Не все так просто имхо.
при вызове free выхов будет в последовательности:
beforedestruction;
desctuctor;
freeinstance.

Поэтому если к вашему примеру добавить содержательный деструктор, то будет лажа - деструктор будет отрабатывать каждый раз. Ну буду углубляться - думаю понятно, о чем я говорю.
Можете проверить...
Т.е. надо как-то воспротивится вызову destructor.
Скорее всего освобождение ресурсов надо делать прямо в freeinstance.


 
Locker   (2004-04-23 14:42) [40]

unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm2 = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   pForm: pointer;
 public
   constructor Create(a_Owner: TComponent); override;
   destructor Destroy; override;
 end;

implementation

{$R *.dfm}

{ TForm2 }

constructor TForm2.Create(a_Owner: TComponent);
const
 bForm: TForm2 = nil;
begin
 if (bForm <> nil) then
 begin
   Self := bForm;
   Self.BringToFront; // это чтобы нагляднее было
 end
 else
 begin
   inherited Create(a_Owner);
   pForm := @bForm;
   TForm2(pForm^) := Self;
 end;
end;

destructor TForm2.Destroy;
begin
 TForm2(pForm^) := nil;
 inherited;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;



Страницы: 1 2 3 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.039 c
14-1082977640
Малой
2004-04-26 15:07
2004.05.16
Приветствие


8-1076930413
r00t
2004-02-16 14:20
2004.05.16
Компонент, работающий с gif на уровне канвы.


1-1083231666
Goida
2004-04-29 13:41
2004.05.16
Запуск программой себя же...


7-1081344537
Fotog
2004-04-07 17:28
2004.05.16
CR-R


11-1068700287
Ciber SLasH
2003-11-13 08:11
2004.05.16
Есть ли в KOL компонент типа TImage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский