Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.039 c
1-1083233376
ЁПРСТ
2004-04-29 14:09
2004.05.16
Размер ComboBox`а


8-1077817254
Простой
2004-02-26 20:40
2004.05.16
Восстановление jpg-файла


14-1083134355
Тимохов
2004-04-28 10:39
2004.05.16
TThread.WaitFor


4-1080043988
Vova
2004-03-23 15:13
2004.05.16
как зделать щоб сервис работал при смене пользователя!!!!


1-1083291386
CyBeR
2004-04-30 06:16
2004.05.16
Переход другую форму с помощью закладок