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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.07 MB
Время: 0.034 c
15-1213188408
ПЛОВ
2008-06-11 16:46
2008.08.03
Печать на матричном принтере


15-1213900263
No_Dead
2008-06-19 22:31
2008.08.03
что-то я не уловил почему так... (о пхп)


2-1214880947
Alexey.sh
2008-07-01 06:55
2008.08.03
Проблема с модулем dialogs.pas


2-1215104995
blazerad
2008-07-03 21:09
2008.08.03
ShowMessage


2-1214904699
Skary
2008-07-01 13:31
2008.08.03
Звук





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский