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

Вниз

Ищу работу   Найти похожие ветки 

 
isasa ©   (2008-06-16 15:15) [200]

Ega23 ©   (16.06.08 14:57) [194]

Ошибок - нет. Кривизна - есть.


Ну а куда ты поместишь инициализацию экземпляра формы, чтобы он был при Создать форму.

Ну Борланд придумал так, плюс еще..

 Application.CreateForm(TForm1, Form1);

Компилируй и юзай. Что неправильно. Да "пложой стиль", не по правилам(сейчас oxffff © меня сожрет). Не нравится исправляй.

Ответ в том, исправит ли рефакторинг(или предложаит исправить Form1 на Self) ? :)


 
Ega23 ©   (2008-06-16 15:15) [201]


> В студию. Кратко.


Сергей, ну сколько можно уже, а? Ну не должен какой-то класс знать что-то о каком-то конкретном экземпляре этого же класса.


 
Плохиш ©   (2008-06-16 15:16) [202]


> oxffff ©   (16.06.08 15:09) [199]

У это вам неинтересно

>>isasa ©   (16.06.08 12:10) [147]
>>>oxffff ©   (16.06.08 12:06) [144]

>>>Это про какие такие вы принципы нарушения ООП говорите.

>>Пожелание о том, что код метода класса не должен ничего "знать" о >>конкретном экземпляре этого класса.

вы же хотите конкретную цитату из единственной книжки, которую вы якобы осилили. Как здесь говорят "детский сад в другом месте".


 
oxffff ©   (2008-06-16 15:24) [203]


> Ega23 ©   (16.06.08 15:15) [201]
>
> > В студию. Кратко.
>
>
> Сергей, ну сколько можно уже, а? Ну не должен какой-то класс
> знать что-то о каком-то конкретном экземпляре этого же класса.
>


Ребята я на полном серьезе повторяю.
Что ваши слова должны быть потверждены.
Если вы утверждаете о каком то нарушении ООП, а частности реализации ООП Delphi. Тогда сформулируйте правило, которое нарушено.
Покажите где нарушена инкапсуляция.
Если я использую тип в модуле где он объявлен, то нарушения нет.
Все  в рамках правил Delphi.

Поэтому нарушение сокрытия здесь нет.

Поэтому твоя формулировка

>Ну не должен какой-то класс знать что-то о каком-то конкретном >экземпляре этого же класса.

более чем странная.

Класс не знает, а использует экземпляр класса(в данном случае экземпляр себя).


 
isasa ©   (2008-06-16 15:25) [204]

Плохиш ©   (16.06.08 15:16) [202]

вы же хотите конкретную цитату из единственной книжки, которую вы якобы осилили. Как здесь говорят "детский сад в другом месте".


Ну это лучше, чем с загадочным видом нести ахинею, или глупости.


 
oxffff ©   (2008-06-16 15:26) [205]


> Компилируй и юзай. Что неправильно. Да "пложой стиль", не
> по правилам(сейчас oxffff © меня сожрет). Не нравится исправляй.
>


Да ну что вы. Я довольно Friendly человек.


 
DVM ©   (2008-06-16 15:30) [206]


> Плохиш ©   (16.06.08 15:16) [202]
>
>


> вы же хотите конкретную цитату из единственной книжки, которую
> вы якобы осилили. Как здесь говорят "детский сад в другом
> месте".

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


 
clickmaker ©   (2008-06-16 15:31) [207]

> Класс не знает, а использует экземпляр класса(в данном случае
> экземпляр себя).

если себя, то почему не Self?
Если "типа универсальность", то почему не GetFormToSetCaption().Caption := ... ?


 
isasa ©   (2008-06-16 15:31) [208]

oxffff ©   (16.06.08 15:26) [205]

Да ну что вы. Я довольно Friendly человек.


В этом вопросе я целиком на вашей стороне. Только я использую оговорку, Дельфи не "польностью" следует "хорошему тону" ООП.


 
oxffff ©   (2008-06-16 15:38) [209]


> Плохиш ©   (16.06.08 15:16) [202]
>
> > oxffff ©   (16.06.08 15:09) [199]
>
> У это вам неинтересно
>
> >>isasa ©   (16.06.08 12:10) [147]
> >>>oxffff ©   (16.06.08 12:06) [144]
>
> >>>Это про какие такие вы принципы нарушения ООП говорите.
>
>
> >>Пожелание о том, что код метода класса не должен ничего
> "знать" о >>конкретном экземпляре этого класса.
>
> вы же хотите конкретную цитату из единственной книжки, которую
> вы якобы осилили. Как здесь говорят "детский сад в другом
> месте".


Ну и долго вы будете отвечать на вопрос "сам дурак"?

Использование в реализации ссылки на экзепляр самого себя не противоречит ООП и бывает очень востребовано.
Например У вас Есть абстрактный класс

type

TAbstractStreamObject=class
public
function Read(...):integer;virtual;
function write(...):integer;virtual;
end;

function InitializeGlobalStream(obj:TAbstractStreamObject):integer;

implementation

var GlobalIntercept:TAbstractStreamObject;

function TAbstractStreamObject.Read(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.read(...)
 else...
end;

function TAbstractStreamObject.Write(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.Write(...)
 else...
end;

Таким образом вы можете установить\менять перехватчик runtime.
Причем передавать в конструктор его не нужно (экономим передачу и место в памяти). Он разделяется всеми экземплярами.


 
oxffff ©   (2008-06-16 15:39) [210]


> clickmaker ©   (16.06.08 15:31) [207]
> > Класс не знает, а использует экземпляр класса(в данном
> случае
> > экземпляр себя).
>
> если себя, то почему не Self?
> Если "типа универсальность", то почему не GetFormToSetCaption().
> Caption := ... ?


В данном случае экземпляр себя как типа, либо производного.
см. пример [209].


 
Ega23 ©   (2008-06-16 15:41) [211]


> Класс не знает, а использует экземпляр класса(в данном случае
> экземпляр себя).


Блин, ну есть же Self для этого!!!

чем плох такой код:

if CheckBox1.Checked=True then
begin
 CheckBox1.Checked := False;
end
else
begin
 if CheckBox1.Checke=False then
 begin
   CheckBox1.Checked := True;
 end
 else
   raise Exception.Create("Unknown boolean value!");
end;  


 
b z   (2008-06-16 15:42) [212]


> Unknown boolean value
Замечено, что программисты зачастую пишут функции, которые возвращают ложь (return false по-басурмански). Негоже это. Коли приметишь, такое непотребство, немедленно учини разбирательство и потребуй, чтобы такого боле не повторялось. А коли программисты начнут нести околесицу про булевы функции и необходимость возвращения двух значений, осади их и скажи, что для двух значений ложь не нужна. Можно же взять правду и горькую правду. Пущай везде в своем коде заменят ложь на горькую правду. Только так можно получить по настоящему благодатный код.


 
oxffff ©   (2008-06-16 15:42) [213]


> isasa ©   (16.06.08 15:31) [208]
> oxffff ©   (16.06.08 15:26) [205]
>
> Да ну что вы. Я довольно Friendly человек.
>
> В этом вопросе я целиком на вашей стороне. Только я использую
> оговорку, Дельфи не "польностью" следует "хорошему тону"
> ООП.


На сколько я понял вы хотели сказать наверно не ООП,
а возможное нарушение типа за счет Untyped var.

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);


 
oxffff ©   (2008-06-16 15:47) [214]


> Ega23 ©   (16.06.08 15:41) [211]
>
> > Класс не знает, а использует экземпляр класса(в данном
> случае
> > экземпляр себя).


Что с примером?

Повторю еще раз.
Я имел ввиду использование экземпляра себя как типа (т.е. экземпляра этого типа, так и производного типа)
см. [209]


 
clickmaker ©   (2008-06-16 15:49) [215]

> function TAbstractStreamObject.Read(..)....
> begin
> if assigned(GlobalIntercept) then result:=GlobalIntercept.read(...)

эээ... не понял без стакана.
Рекурсия же получается? Или 2 разных объекта: тот, откуда вызывается GlobalIntercept.read и собственно сам GlobalIntercept?


 
oxffff ©   (2008-06-16 15:54) [216]


> clickmaker ©   (16.06.08 15:49) [215]


type

TAbstractStreamObject=class
public
function Read(...):integer;virtual;
function write(...):integer;virtual;
end;

TSomeClientStreamObject=class(TAbstractStreamObject)
  function Read(...):integer;override;
     begin
    .........
     inherited;
     end;

   function write(...):integer;virtual;
     begin
       .........
     inherited;
     end;
end;

function InitializeGlobalStream(obj:TAbstractStreamObject):integer;

implementation

var GlobalIntercept:TAbstractStreamObject;

function TAbstractStreamObject.Read(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.read(...)
else...
end;

function TAbstractStreamObject.Write(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.Write(...)
else...
end;

Другой модуль.

TIntercepttreamObjectA=class(TAbstractStreamObject)
  function Read(...):integer;override;
     begin
    .........
//      inherited;
     end;

   function write(...):integer;virtual;
     begin
       .........
//      inherited;
     end;

initialization

InitializeGlobalStream(TIntercepttreamObjectA.create(..));


 
Ega23 ©   (2008-06-16 15:54) [217]


> Что с примером?
>
> Повторю еще раз.
> Я имел ввиду использование экземпляра себя как типа (т.е.
>  экземпляра этого типа, так и производного типа)
> см. [209]


Честно говоря, я не понял примера. Покажи код InitializeGlobalStream, может понятней станет.


 
clickmaker ©   (2008-06-16 15:57) [218]

> код InitializeGlobalStream

procedure InitializeGlobalStream(AStream: TAbstractStreamObject)
begin
 GlobalIntercept := AStream;
end;

:)


 
oxffff ©   (2008-06-16 15:57) [219]

function InitializeGlobalStream(obj:TAbstractStreamObject):integer;
begin
GlobalIntercept:=obj;
end;


 
oxffff ©   (2008-06-16 15:58) [220]


> clickmaker ©   (16.06.08 15:57) [218]
> > код InitializeGlobalStream
>
> procedure InitializeGlobalStream(AStream: TAbstractStreamObject)
> begin
>  GlobalIntercept := AStream;
> end;
>
> :)


Теперь вы согласны, что выгода есть?


 
clickmaker ©   (2008-06-16 16:03) [221]

цепочка вызовов
GlobalIntercept <- объект типа TIntercepttreamObjectA
GlobalIntercept.read()
TAbstractStreamObject.read()
GlobalIntercept <> nil ? yes!
GlobalIntercept.read()
и т.д.

или мне срочно надо похмеляццо, или тут рекурсия. Это вообще рабочий код?


 
oxffff ©   (2008-06-16 16:06) [222]


> clickmaker ©   (16.06.08 16:03) [221]
> цепочка вызовов
> GlobalIntercept <- объект типа TIntercepttreamObjectA
> GlobalIntercept.read()
> TAbstractStreamObject.read()
> GlobalIntercept <> nil ? yes!
> GlobalIntercept.read()
> и т.д.
>
> или мне срочно надо похмеляццо, или тут рекурсия. Это вообще
> рабочий код?


Вызов не перехватчиков приведет к вызову перехватчика.
А у перехватчика нет вызова самого себя поскольку inherited закомментирован.

Я же пометил жирным inherited в одном случае и закоменченный inherited в другом.


 
Ega23 ©   (2008-06-16 16:07) [223]

Какой-то "недо-singleton" получился...
Ну да ладно. В данном конкретном примере - предположим что именно такой функционал нужен. Решение как решение.
Но есть одно "но": объявление переменной выполнено в секции implementation, а не interface.


 
oxffff ©   (2008-06-16 16:10) [224]

>"недо-singleton"

Это не синглетон. У синглетона другая задача.


> Но есть одно "но": объявление переменной выполнено в секции
> implementation, а не interface.


Объяви в interface. Нет проблем.


 
Ega23 ©   (2008-06-16 16:19) [225]


> Объяви в interface. Нет проблем.


Проблем есть. Т.к. рано или поздно это дело будет использовано кем-то другим.
Если так подходить, то ни private ни protected нафиг не нужны - пиши всё в public и нет проблем.  :)


 
Ega23 ©   (2008-06-16 16:20) [226]


> Это не синглетон. У синглетона другая задача.


Да я вижу. Нечто похожее, но не оно - у тебя в рантайм менять можно.


 
oxffff ©   (2008-06-16 16:24) [227]


> Ega23 ©   (16.06.08 16:19) [225]
>
> > Объяви в interface. Нет проблем.
>
>
> Проблем есть. Т.к. рано или поздно это дело будет использовано
> кем-то другим.
> Если так подходить, то ни private ни protected нафиг не
> нужны - пиши всё в public и нет проблем.  :)


Проблема выбора interface или implementation отношения к ООП не имеет. Это выбор разработчика предоставить доступ или вообще полностью скрыть.


 
oxffff ©   (2008-06-16 16:26) [228]


> Ega23 ©   (16.06.08 16:20) [226]
>
> > Это не синглетон. У синглетона другая задача.
>
>
> Да я вижу. Нечто похожее, но не оно - у тебя в рантайм менять
> можно.


У синглетона назначение гарантировать существование не более одного экземпляра. А здесь просто использование shared объекта.


 
Ega23 ©   (2008-06-16 16:28) [229]


> У синглетона назначение гарантировать существование не более
> одного экземпляра. А здесь просто использование shared объекта.


Да вижу я, не надо объяснять. Я просто в [223] смайлик забыл поставить..  :)


 
isasa ©   (2008-06-16 16:30) [230]

oxffff ©   (16.06.08 16:10) [224]

:)
Я бы все таки не смешивал идеал и способы его конкретной реализации.
Есть краски, а есть картины.
Идеал, он в общем то, недостижим..


 
oxffff ©   (2008-06-16 16:35) [231]


> isasa ©   (16.06.08 16:30) [230]


Однако я так и не услышал нарушение принципов ООП от других участников в примере который мы(все) уже раздули до мамонта.


 
Игорь Шевченко ©   (2008-06-16 18:16) [232]

Дабы флейм не стихал:

Где в этом коде ошибка?

procedure TForm1.ButtonClick (Sender: TObject);
begin
 Form1.Caption := "Blah";
 Form2.Caption := "Foo";
end;


 
Kostafey ©   (2008-06-16 18:24) [233]

Ну коли

> Дабы флейм не стихал:


Повторюсь, что код не компилируется :)
procedure TFоrm1.ButtоnCliсk (Sеnder: TОbject);
begin
Fоrm1.Caption := "Blah";
Fоrm2.Caption := "Foo";
end;


 
McSimm ©   (2008-06-16 18:26) [234]


> Игорь Шевченко ©   (16.06.08 18:16) [232]
>
> Дабы флейм не стихал:
>
> Где в этом коде ошибка?

Должно быть TForm1.Button1Click
:)


 
Virgo_Style ©   (2008-06-16 18:28) [235]

procedure TFоrm1.ButtоnCliсk (Sеnder: TОbject);
 Form1.Caption := "Alpha";
 Self.Caption = "Bravo";
 Caption = "Charlie";
end;


 
Virgo_Style ©   (2008-06-16 18:29) [236]

Virgo_Style ©   (16.06.08 18:28) [235]

Ну вот, двоеточия потерял. Так лучше:

procedure TFоrm1.ButtоnCliсk (Sеnder: TОbject);
Form1.Caption := "Alpha";
Self.Caption := "Bravo";
Caption := "Charlie";
end;


 
Ega23 ©   (2008-06-16 18:39) [237]


> Virgo_Style ©   (16.06.08 18:28) [235]


begin отсутствует.
А кому будешь Delta, Easy, Foxtrot и Golf раздавать?


 
Anatoly Podgoretsky ©   (2008-06-16 19:30) [238]

> Ega23  (16.06.2008 18:39:57)  [237]

Из этих четырех ников вроде только один правильный.


 
Virgo_Style ©   (2008-06-16 20:38) [239]

Ega23 ©   (16.06.08 18:39) [237]
begin отсутствует.


Торможу. Все-таки возможность редактирования сообщений была бы иногда очень кстати...


> А кому будешь Delta, Easy, Foxtrot и Golf раздавать?


Землю крестьянам, власть рабочим, Фокстрот танцорам, Гольф игрокам (или автомобилистам?)... А вот с первыми двумя надо думать.


 
DVM ©   (2008-06-16 22:05) [240]

procedure TForm1.Button1Click(Sender: TObject);
begin
 Captiоn := "Где тут ошибка"?
end;


А вот этот код не компилится, так как тут ошибка. Где она?



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

Текущий архив: 2008.08.03;
Скачать: CL | DM;

Наверх




Память: 1.09 MB
Время: 0.04 c
15-1213760616
AlexanderMS
2008-06-18 07:43
2008.08.03
Подскажите, пожалуйста, хороший формат голосовой аудиозаписи.


15-1213846622
Slider007
2008-06-19 07:37
2008.08.03
С днем рождения ! 19 июня 2008 четверг


10-1139646655
_Seldon_
2006-02-11 11:30
2008.08.03
Delphi+Visio


15-1213627509
Viktor198
2008-06-16 18:45
2008.08.03
Помогите составить блок-схему для программы!!!


2-1214905271
Саша
2008-07-01 13:41
2008.08.03
Выделение строк в ListBox