Форум: "Потрепаться";
Текущий архив: 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