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

Вниз

Структурность vs Простота   Найти похожие ветки 

 
Kolan ©   (2007-07-26 15:33) [40]

> Опыт очень хорошее дело.

В смысле провести опыт, или всмысле опыт многих лет работы? Такие штуки с маленьким медиатором я последне время часто делаю&#133


 
Игорь Шевченко ©   (2007-07-26 15:37) [41]

Kolan ©   (26.07.07 15:33) [40]

В смысле многих лет конечно. Когда начинаешь ценить простоту.


 
Kolan ©   (2007-07-26 15:42) [42]

> Когда начинаешь ценить простоту.

Дык вы считаете перекрёсные ссылки пойдут?
Не, я согласен что для случая из сабжа(два объекта) пойдёт, но как только их станет три, я сделаю медиатор&#133
А вы?

ЗЫ
 Надо же опыт перенимать :)


 
Piter ©   (2007-07-26 15:50) [43]

Kolan ©   (26.07.07 14:57) [37]
Где сказано, что это хорошая практика?


а где сказано, что плохая?

Kolan ©   (26.07.07 14:57) [37]
Тогда гл. форма связана уже с 10 объектами, а в моём случае как был 1 медиатор, так и остался.


Зато все 10 форм связаны с медиатором. Не понял.
Опять же 10 связей.

Kolan ©   (26.07.07 14:57) [37]
В форме надо сделать метод MyShow(назание придумаете сами), который и будет снимать/устанавливать галочку


ага, ну офигеть. Это просто городить огород. Для такого элементарного действия придумывать такие ходы...

Ну нафиг. Версия с событиями куда нагляднее, имхо. Есть объект как черный ящик. Хочешь - делай над ним действия (показывай, скрывай), если хочешь узнать о событиях черного ящика - ты ему говоришь "если у тебя такая фигня случится - ты мне свистни" и указываешь куда свистнуть. Ну логично же?

Вместо этого заводишь посредника, который говорит форме "ты если что случится - свистни мне, а я уже свистну кому надо, и наоборот". В случае с галочкой это уже перебор. В более сложной логике - ну может быть это упростит задачу.


 
Sandman29 ©   (2007-07-26 15:55) [44]

Игорь Шевченко ©   (26.07.07 15:37) [41]

Простота часто вступает в противоречие с удобством дальнейших изменений


 
Игорь Шевченко ©   (2007-07-26 16:01) [45]

Kolan ©   (26.07.07 15:42) [42]

Я считаю, что в данном примере достаточно сделать Notification, потому что механизм оповещения срабатывает автоматически и никакого дополнительного кода для этого писать не надо.

Например:

unit main;

interface
uses
 Classes, Graphics, Controls, Forms, StdCtrls;

type
 TfMain = class(TForm)
   CheckBox1: TCheckBox;
   procedure CheckBox1Click(Sender: TObject);
 public
   procedure Notification (AComponent: TComponent;
     AOperation: TOperation); override;
 end;

var
 fMain: TfMain;

implementation
uses
 Child;

{$R *.dfm}

procedure TfMain.CheckBox1Click(Sender: TObject);
var
 ChildForm: TComponent;
begin
 if CheckBox1.Checked then
   with TfChild.Create(Self) do
     Show
 else
 begin
   ChildForm := FindComponent("fChild");
   if Assigned(ChildForm) and not (csDestroying in ChildForm.ComponentState) then
     ChildForm.Free;
 end;
end;

procedure TfMain.Notification(AComponent: TComponent; AOperation: TOperation);
begin
 inherited;
 if (AComponent.ClassName = "TfChild") and (AOperation = opRemove) then
   CheckBox1.Checked := false;
end;

end.


unit Child;

interface
uses
 Classes, Graphics, Controls, Forms;

type
 TfChild = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 end;

implementation

{$R *.dfm}

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

end.


Можно попробовать...


 
Игорь Шевченко ©   (2007-07-26 16:02) [46]

Sandman29 ©   (26.07.07 15:55) [44]


> Простота часто вступает в противоречие с удобством дальнейших
> изменений


Никогда


 
Kolan ©   (2007-07-26 16:19) [47]

> а где сказано, что плохая?

Во многих книгах/статьях, еще раз говорю это повышает связывание. Сильно связание объекты сами посебе — не проблемма вообще. Проблема возникает когда они изменяются.

Опять же 10 связей.
Вы не понимаете термин связывание. Прочтайте литаратуру, по сам паттерн хотябы&#133
Высокая степень связывания — когда объект зависит от большого числа других объектов.

Без медиатора форма зависит от 10 объектов.
С медиатором от одного.

В худщем случае, при вашем подходе, кажды объект будет связан с каждым. медиатор же разбивате эти связи. С медиатором каждый объект знает только медиатор.
То что сам медиатор будет свзан со всеми — нестрашно(это его предназначение по сути), так как он один, изменяется редко.

ага, ну офигеть. Это просто городить огород.
Я повторяю. если вы пишете фигню на 100 строк, то вы правы. Если вы пишете серьёзный(сложный) проект, то вы его в итоге провалите(хотябы по срокам).

Ну логично же?
Конечно логично, только:

> ты ему говоришь «если у тебя такая фигня случится — ты мне
> свистни»

А что будет если этих ТЫ не один а много, как тогда? В Delphi вы не подключитесь к одному событию несколькоми объектами.


> Вместо этого заводишь посредника, который говорит форме
> «ты если что случится — свистни мне, а я уже свистну кому
> надо, и наоборот».

Нет, не так.

Форма говорит медиатору: «Свести всем».


> с галочкой это уже перебор

Если вы спрашиваете про конкретный сабж с галочкой, то перебор. Я думаю вы хотите понят как делать это в более сложном случае. а галочка — это пример.

Сделать перекрёсные ссыки — быстро только в начале, при добавлении новых, зависящих от галочи, объектов с медиатором вы сэкономите гораздо больше времени, чем потратите на его создание вначале.


 
Kolan ©   (2007-07-26 16:21) [48]

> Я считаю, что в данном примере достаточно сделать Notification

Да ниче подход, согласен. Проще медиатора/наблюдателя и лучьше перекрёсных ссылок.


 
Kolan ©   (2007-07-26 16:23) [49]

Удалено модератором


 
Sandman29 ©   (2007-07-26 16:39) [50]

Игорь Шевченко ©   (26.07.07 16:02) [46]

Никогда

Проще скопировать, чем унаследовать, Вы не находите? Дальше продолжать?


 
Игорь Шевченко ©   (2007-07-26 16:39) [51]

Kolan ©   (26.07.07 16:19) [47]


> Если вы спрашиваете про конкретный сабж с галочкой, то перебор.
>  Я думаю вы хотите понят как делать это в более сложном
> случае. а галочка — это пример.


Еще раз (возвращаясь к вопросу о DataLayer и прочем): Демонстрировать всякие паттерны на простых примерах вроде таблиц с двумя полями или галки с формой при реализации на Delphi просто бессмысленно.
Для простых вещей в Delphi, слава Аллаху, достаточно простых и опробованных методов, а всякие паттерны только собьют с толку.
Хочется демостраций - их надо изучать на сложных примерах.

Хороший пример для демострации, правда, совсем иного, приведен у Мартина Фаулера в книге "Рефакторинг", в самом начале.


 
Piter ©   (2007-07-26 16:43) [52]

Kolan ©   (26.07.07 16:19) [47]
С медиатором от одного


зато сам медиатор зависит от этих самых 10-ти форм!

Kolan ©   (26.07.07 16:19) [47]
То что сам медиатор будет свзан со всеми — нестрашно


Ну да. Если форма связана - это страшно, это нарушение паттерна и высокая степень связывания.

Когда медиатор связан - это не страшно, это фича!

Не вижу логики.

Kolan ©   (26.07.07 16:19) [47]
А что будет если этих ТЫ не один а много, как тогда? В Delphi вы не подключитесь к одному событию несколькоми объектами


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

AddListener(<ссылка на функцию>)
DeleteListener(<ссылка на функцию>)

А информацию о тех, кто требует уведомления - отлично хранить в TList

Kolan ©   (26.07.07 16:19) [47]
Я думаю вы хотите понят как делать это в более сложном случае


да возможные варианты я понимаю. Просто интересно кто как на самом деле делает. Абсолютно правильной точки зрения тут нету. Я сам из проекта в проект то так, то эдак делаю. И не могу понять как нагляднее что ли.


 
Игорь Шевченко ©   (2007-07-26 16:46) [53]

Sandman29 ©   (26.07.07 16:39) [50]


> Проще скопировать, чем унаследовать, Вы не находите? Дальше
> продолжать?


Дружище, я имею в виду не простоту труда, а простоту реализации. Это две совершенно разные вещи.

Простота, а не легкость.

И, кстати, иногда проще (и легче) скопировать.


 
Sandman29 ©   (2007-07-26 16:46) [54]

Piter ©   (26.07.07 16:43) [52]

Когда медиатор связан - это не страшно, это фича!

Не вижу логики.


Медиатор завязан на конкретное приложение, а каждую отдельную форму можно использвать где угодно.


 
Sandman29 ©   (2007-07-26 16:49) [55]

Игорь Шевченко ©   (26.07.07 16:46) [53]

Что есть простота реализации?


 
Kolan ©   (2007-07-26 16:52) [56]


> Когда медиатор связан &#151; это не страшно, это фича!

Ну ты ленивый что ли? RTFM

Лана давай считать вместе. У тебя есть 10 объектов и все они должны быть связаы(по логике) друг с другом, сколько связей?
&#151; Правильно 100.

Теперь с медиатором. Каждый объект связан с медиатором &#151; 10 связей. И медиатор знает всех &#151; 10 связей. Сколько всего?
Правильно 20.

Ок?


> А информацию о тех, кто требует уведомления &#151; отлично хранить
> в TList

Ну вот вы и приближаетесь к &laquo;Наблюдателю&raquo;.


> Просто интересно кто как на самом деле делает.


Вот чес слово, вот лично я делаю(не сделал бы, а делаю) медиатор.


 
Игорь Шевченко ©   (2007-07-26 16:52) [57]

Sandman29 ©   (26.07.07 16:49) [55]


> Что есть простота реализации?


пост № 29:

"Существует одно простое правило, которого я стараюсь сам придерживаться и другим рекомендую:
Алгоритм программы должен быть реализован минимальным количеством ясных и понятных операторов."


 
Kolan ©   (2007-07-26 16:57) [58]

> Еще раз (возвращаясь к вопросу о DataLayer и прочем):

Нет, это не тот случай. С DataLayer &#151; согласен, на Delphi слишком много надо написать, чтобы работало&#133


> или галки с формой при реализации на Delphi просто бессмысленно.

Тут очень смысленно.


> Для простых вещей в Delphi, слава Аллаху, достаточно простых
> и опробованных методов, а всякие паттерны только собьют
> с толку.

В данном случае язык не важен. Да я и не демонстрирую, я говорю что я так делаю. Все остальное &#151; док-во что это не самый полохой подход.


> Хочется демостраций &#151; их надо изучать на сложных примерах.

Мой поедены Ктулху мозг с трудом в простые примеры вникает, а вы про сложные&#133


> Хороший пример для демострации, правда, совсем иного

Про провалившейся проект?


 
Игорь Шевченко ©   (2007-07-26 16:59) [59]

Kolan ©   (26.07.07 16:57) [58]


> > Хороший пример для демострации, правда, совсем иного
>
> Про провалившейся проект?


Я про пример из книги Фаулера "Рефакторинг". Фаулер не одну книгу написал.


 
Kolan ©   (2007-07-26 17:01) [60]

> пост № 29:

Что-то я его проглядел.


> нечно, можно и GoF вооружаться.

Уверен что GoF знает большее кол-во людей чем VCL&#133


 
Sandman29 ©   (2007-07-26 17:02) [61]

Игорь Шевченко ©   (26.07.07 16:52) [57]

Так я же и говорю - копирование. Куда уж минимальней и понятней.


 
Kolan ©   (2007-07-26 17:03) [62]


> Я про пример из книги Фаулера &laquo;Рефакторинг&raquo;.

Я про  неёже и Говорю(Refactoring Improving the Designof Existing Code)&#133

Вы про это:
Once upon a time, a consultant made a visit to a development project.
{&#133}
Six months later the project failed, in large part because the code was too complex to debug or to tune to acceptable performance.


 
Kolan ©   (2007-07-26 17:03) [63]

> Так я же и говорю &#151; копирование.

Игорь Шевченко не об этом, имхо&#133


 
Игорь Шевченко ©   (2007-07-26 17:05) [64]

Kolan ©   (26.07.07 17:03) [62]


> Once upon a time, a consultant made a visit to a development
> project.
> {…}
> Six months later the project failed, in large part because
> the code was too complex to debug or to tune to acceptable
> performance


Нет, я не про это. Я про пример с видеопрокатом,  собственно, демонстрации рефакторинга.


 
Kolan ©   (2007-07-26 17:08) [65]

> Нет, я не про это. Я про пример с видеопрокатом,  собственно,
> демонстрации рефакторинга.

So I have to ask you to look at this and imagine it in the context of a much larger system.


Что я и пытаюсь сделать, и этого же про DataLayer хотел от вас&#133


 
Sandman29 ©   (2007-07-26 17:16) [66]

Kolan ©   (26.07.07 17:03) [63]

А о чем? Может ты объяснишь?


 
Игорь Шевченко ©   (2007-07-26 17:23) [67]

Kolan ©   (26.07.07 17:08) [65]

Я по русской книге смотрю, это глава 1.
Но даже тот пример, что приведен у Фаулера, это не таблица из двух бессмысленных полей (ID,Value), а вполне себе достаточный кусок кода.

Я, когда приобрел эту книгу (почти сразу, как появилась в России), смотрел на приведенный код и считал, что код, как код, многие так пишут, вполне себе. Потом, когда автор начал его корежить, я понял, в чем суть того, о чем дальше будет книга и мне это понравилось :)

Это я к тому, что хороший осмысленный пример чего-либо дает гораздо больше, чем демонстрация чего-либо в отрыве от практики.


 
Kolan ©   (2007-07-26 17:31) [68]

> Я по русской книге смотрю, это глава 1.

Ну все правильно, после [65] Kolan ©   (26.07.07 17:08) в русской версии идут слова &laquo;исходная программа&raquo;

> Это я к тому, что хороший осмысленный пример чего-либо дает
> гораздо больше, чем демонстрация чего-либо в отрыве от практики.

+1, только выходит что если я хочу вопрос задать(не понятно мне что-то) мне надо книгу написать, ну или пример листов на 100&#133
Ессно такой пример я не напишу, вот я и упрощаю.


 
Piter ©   (2007-07-26 17:33) [69]

Sandman29 ©   (26.07.07 16:46) [54]
Медиатор завязан на конкретное приложение, а каждую отдельную форму можно использвать где угодно


ага. Особенно там, где нет медиатора.

Не понял.

Kolan ©   (26.07.07 16:52) [56]
Лана давай считать вместе. У тебя есть 10 объектов и все они должны быть связаы(по логике)


это по какой такой логике интересной?! Если одна форма знает о двух других, это вообще не означает, что эти две формы знают друг о друге. В большинстве случае это и не так вовсе.

Игорь Шевченко ©   (26.07.07 16:52) [57]
Алгоритм программы должен быть реализован минимальным количеством ясных и понятных операторов


гы. Напрашивается логичное продолжение - "и, видимо, максимальным количеством неясных и непонятных операторов"

:)))))

Kolan ©   (26.07.07 17:01) [60]
Уверен что GoF знает большее кол-во людей чем VCL


но с другой стороны твой код скорее всего будет смотреть человек, который знает VCL, чем GoF


 
Игорь Шевченко ©   (2007-07-26 17:34) [70]

Kolan ©   (26.07.07 17:31) [68]


> только выходит что если я хочу вопрос задать(не понятно
> мне что-то) мне надо книгу написать, ну или пример листов
> на 100…
> Ессно такой пример я не напишу, вот я и упрощаю.


даже такой, как у Фаулера не напишешь ? Там не 100 листов, а от силы 2.

Книгу надо не писать, книгу надо читать.


 
Игорь Шевченко ©   (2007-07-26 17:35) [71]

Piter ©   (26.07.07 17:33) [69]


> Напрашивается логичное продолжение - "и, видимо, максимальным
> количеством неясных и непонятных операторов"


И такое случается. В этом случае автора программы обычно долго вспоминают нелестными словами. После его увольнения.


 
Sandman29 ©   (2007-07-26 17:39) [72]

Piter ©   (26.07.07 17:33) [69]

Как ты собираешься использовать форму, которая сама обращается к десятку других форм?


 
Kolan ©   (2007-07-26 17:50) [73]


> Если одна форма знает о двух других, это вообще не означает,
> что эти две формы знают друг о друге.

Ты непробиваем, имхо это пройдет. Это пример, теория, которая часто подтверждается практикой&#133

Меняю свйо совет тебе(только в этом случае) &#151; делай перекресные ссылки и не парься.


 
Piter ©   (2007-07-26 17:58) [74]

Sandman29 ©   (26.07.07 17:39) [72]
Как ты собираешься использовать форму, которая сама обращается к десятку других форм?


а такие главные формы из приложения в приложение и не переносятся, ибо очень индивидуальны. А вот например диалоговую формы настройки TCP/IP соединения вполне можно перенести, они никуда не обращается. В том числе она не обращается ни к какому медиатру.

А вот теперь объясни как ты собираешься использовать форму, если у тебя в другом приложении нету никакого медиатора?


 
Piter ©   (2007-07-26 18:06) [75]

по-моему, любой класс должен быть как можно более самодостаточек (как раз с вашими минимальными числами связи).

Такая форма самодостаточно. Обычно это некая форма настройки, она не использует никакой медиатор. И рассматривать ее можно как отдельное целое.

В твоем случае она использует медиатор - значит надо рассматривать еще и медиатор. А медиатор использует главную форму, надо рассматривать еще и ее. Ну и где тут модульность?

Я понимаю смысл этого медиатора - это типа как диспетчер сообщений. Что-то навроде виндового диспетчера. Но наверное это нужно только в случае очень сложной иерархии.

И, кстати, не в такой реализации как представлена. Тогда уж такой медиатор вообше не должен знать ни о главной форме, ни о дочерних, он вообще ни о чем не должен знать.

Просто разные классы могут регистрироваться у этого диспетчера. Ну например одна форма зарегистрируется как возможный источник события M_SETTING_FORM_CLOSE, а другая форма допустим может подписаться у диспетчера на это событие. Этот диспетчер тогда получится ядром программы в сложных проектах.


 
Bless ©   (2007-07-26 18:08) [76]


> Piter ©   (26.07.07 17:58) [74]
> А вот теперь объясни как ты собираешься использовать форму,
>  если у тебя в другом приложении нету никакого медиатора?
>
>


Дело обстоит приблизительно так, насколько я себе это представляю:

форма организует рассылку сообщений подписчикам. В простейшем случае -рассылку одного сообщение "я изменилась".
Т.е. у нее где-то внутри есть список подписчиков.
Одним из подписчиков будет медиатор. Он знает все о взаимодействии между формами и меняет эти формы под потребности логики приложения, но сами формы ничего друг о друге не знают. Да и о самом медиаторе они почти ничего не знают.

Форме пофигу, кто именно подписался и сколько их.
Если медиатор (в одном приложении) есть, он подпишется и форма будет слать ему сообщения, если нету (в другом приложении) - не подпишется и слать ему форма ничего не будет.


 
Игорь Шевченко ©   (2007-07-26 18:10) [77]

Sandman29 ©   (26.07.07 17:39) [72]

В любом приложении обязательно существует нечто, что определяет его структуру и механизма взаимодействия составных частей. В Delphi это традиционно главная форма или датамодуль, в других средах разработки это контроллер приложения (по Фаулеру) и т.п.

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


 
Piter ©   (2007-07-26 18:13) [78]

Bless ©   (26.07.07 18:08) [76]

похоже на мой вариант, только подписчиком у меня является сама форма, а не медиатор.

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

Мне моя версия кажется более логичной. Источник сам объявит - "я умею делать вот это", а уж другие у диспетчера могут спросить "а есть ли тот, кто может сделать это". Большая степень абстракции, диспетчеру не надо знать вообще о всех, кто может сделать то или иное. Так мне кажется логичнее, на этом принципе построена система плагинов в Miranda.


 
Bless ©   (2007-07-26 18:26) [79]


> Piter ©   (26.07.07 18:13) [78]


Я никоим образом не хотел твою версию принизить или опровергнуть.
Просто показал, что наличие/отсутствие медиатора никак не усложняет повторное использование формы и ответил на [74] (хоть ты и не меня спрашивал), не более того.


 
Piter ©   (2007-07-26 18:30) [80]

Bless ©   (26.07.07 18:26) [79]
Я никоим образом не хотел твою версию принизить или опровергнуть


дык я об этом и не говорил. Просто два разных подхода

Bless ©   (26.07.07 18:26) [79]
Просто показал, что наличие/отсутствие медиатора никак не усложняет повторное использование формы


не. В указанных до этого версиях медиатора как раз без него не обойтись, там все жестко.

А с регистрацией источника события и "клиентов" - это уже чуть другое.



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

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

Наверх




Память: 0.67 MB
Время: 0.025 c
11-1154451905
Stargazer
2006-08-01 21:05
2007.08.26
MDI глючит


15-1185732492
Yanis
2007-07-29 22:08
2007.08.26
Век живи, век учись!


15-1183988140
mrhx
2007-07-09 17:35
2007.08.26
Визуальный редактор GUI с генерацией под разные платформы


2-1185830237
_Anton
2007-07-31 01:17
2007.08.26
Узнать полезное пространство


15-1185349549
gn
2007-07-25 11:45
2007.08.26
Задачка