Текущий архив: 2010.09.12;
Скачать: CL | DM;
Вниз
А вот еще один холиварчик по поводу стиля кодинга Найти похожие ветки
← →
Юрий Зотов © (2010-06-14 19:23) [0]Есть, к примеру булево свойсто EditMode (True - режим редактирования, False - режим просмотра). И есть кнопка EditButton, которая должна быть видимой в режиме редактирования и невидимой - в режиме просмотра. Рассмотрим 2 варианта кодинга.
Вариант 1 - заводим приватное поле, делаем только сеттер:
type
TMyForm = class(TForm)
...
private
FEditMode: boolean;
procedure SetEditMode(const Value: boolean);
public
property EditMode: boolean read FEditMode write SetEditMode;
end;
procedure TMyForm.SetEditMode(const Value: boolean);
begin
if FEditMode <> Value then
begin
FEditMode := Value;
EditButton.Visible := EditMode
end
end;
Вариант 2 - поля не заводим, делаем геттер и сеттер:
type
TMyForm = class(TForm)
...
private
function GetEditMode: boolean;
procedure SetEditMode(const Value: boolean);
public
property EditMode: boolean read GetEditMode write SetEditMode;
end;
function TMyForm.GetEditMode: boolean;
begin
Result := EditButton.Visible
end;
procedure TMyForm.SetEditMode(const Value: boolean);
begin
EditButton.Visible := Value
end;
Внимание - предлагается тема для холиварчика: какой стиль Вы предпочитаете и почему?
← →
sniknik © (2010-06-14 19:28) [1]1 когда пишу компонент/объект. присваивание свойства должно менять связанное с ним
2 когда собственно в программе. т.к. довольно сложно следить что вот присвоили и что-то там само собой поменялось.
т.е. смотря что делаю, "цельный" объект или уже программу.
← →
sniknik © (2010-06-14 19:29) [2]т.е. в данном случае т.к. уже у формы, то второй.
← →
Kerk © (2010-06-14 19:36) [3]Первый вариант лучше, т.к. кода меньше.
← →
Kerk © (2010-06-14 19:42) [4]Это ж очевидно. Чего тут вообще обсуждать? :)
← →
DVM © (2010-06-14 19:44) [5]Из привденных выше предпочту второй, т.к. больше контроля.
Но если есть возможность (например, в случае модальной формы), сделаю так:
я предпочитаю такой:
type
TMyForm = class(TForm)
...
private
FEditMode: boolean;
public
class function ShowMyForm(AEditMode: boolean): boolean;
end;
внутри ShowMyForm понятно - там создание формы, передача значения в FEditMode показ, возврат значения и уничтожение.
← →
В школу! (2010-06-14 19:45) [6]Удалено модератором
← →
Kerk © (2010-06-14 19:45) [7]
> DVM © (14.06.10 19:44) [5]
>
> Из привденных выше предпочту второй, т.к. больше контроля.
Контроля над чем? Нет там в сеттере никакого контроля.
А привычка писать код впрок - большое зло.
← →
DVM © (2010-06-14 19:46) [8]Хотя мне часто лень писать лишний код и если я уверен, что за значения будут получать поле формы, то сделаю по первому варианту.
← →
DVM © (2010-06-14 19:47) [9]
> Kerk © (14.06.10 19:45) [7]
> Нет там в сеттере никакого контроля.
ну я так понимаю это лишь пример.
← →
Kerk © (2010-06-14 19:50) [10]
> DVM © (14.06.10 19:47) [9]
>
> > Kerk © (14.06.10 19:45) [7]
>
> > Нет там в сеттере никакого контроля.
>
> ну я так понимаю это лишь пример.
Если так, то вопрос в сабже теряет смысл. Ибо если нужен контроль, то без геттера (насчет сеттера я выше опечатался) никак. Здесь же вопрос выбора между прямым чтением из переменной и геттером.
← →
Kerk © (2010-06-14 19:50) [11]В общем, слово за ЮЗ. Чего он имел ввиду-то :)
← →
turbouser © (2010-06-14 19:52) [12]В первом варианте есть проверка FEditMode <> Value
кто его знает, чего там в EditButton.Visible происходит.
← →
DVM © (2010-06-14 19:54) [13]
> Kerk © (14.06.10 19:50) [11]
Хотя собственно разница между первым и вторым вариантом не велика. Мне показалось почему то что в первом варианте нет сеттера.
Но в первом варианте есть проверка того факта что присваиваемое значение не равно текущему, иногда такое может быть полезно, особенно если после присвоения значения последует какое то тяжелое действие.
← →
Kerk © (2010-06-14 19:54) [14]
> turbouser © (14.06.10 19:52) [12]
Продолжаем ждать автора, ибо я это списал на условность, т.к. вопрос все же про геттер, а не сеттер :)
← →
DVM © (2010-06-14 19:55) [15]Т.е непонятно, что обсуждаем: отсутствие жеттера или виды сеттеров?
← →
Юрий Зотов © (2010-06-14 20:07) [16]> Здесь же вопрос выбора между прямым чтением из переменной и
> геттером.
Не это главное. В первом варианте мы сами храним значение свойства и никто "мимо нас" изменить его не может. Во втором варианте зачение свойства хранится в published - компоненте и его может изменить кто угодно, причем мы об этом и знать не будем.
> В первом варианте есть проверка FEditMode <> Value
> кто его знает, чего там в EditButton.Visible происходит
Я знаю, и далеко не я один. Там в сеттере происходит та же самая проверка. Такие проверки - это стандартный (и обязательный) стиль профессионального кодинга классов. Во-первых, он позволяет не делать лишних операций (часто, громоздких и долгих), а во-вторых, в ряде случаев позволяет избежать бесконечной рекурсии.
==================
> All
Информация к размышлению: кнопка EditButton лежит, например, на панели.
← →
KilkennyCat © (2010-06-14 20:08) [17]гм... а я бы там, где этот режим меняется написал бы button.visible := editmode и все.
← →
Омлет © (2010-06-14 20:08) [18]Данные от их представления надо разделять.
По какой-то логике придется скрыть EditButton и во втором варианте GetEditMode вернет ошибочное значение.
Т.е. - лучше первый вариант с доработкой:procedure TMyForm.SetEditMode(const Value: boolean);
begin
FEditMode := Value;
EditButton.Visible := Value
end;
т.к., опять же, EditButton.Visible может не соответствовать FEditMode на момент вызова сеттера.
← →
uw © (2010-06-14 20:10) [19]Если бы вместо EditButton был Action, то по барабану.
Если в ТЗ написано, что непременно EditButton, то опять по барабану.
Если никакого ТЗ, но предполагается, тип EditButton может со временем измениться, снова по барабану.
По барабану получается.
← →
Омлет © (2010-06-14 20:12) [20]> Омлет © (14.06.10 20:08) [18]
> лучше первый вариант с доработкой
при условии, что в сеттере EditButton.SetVisible есть проверка на предотвращение лишних операций )
А иначе надо такprocedure TMyForm.SetEditMode(const Value: boolean);
begin
FEditMode := Value;
if Value <> EditButton.Visible then
EditButton.Visible := Value
end;
← →
Kerk © (2010-06-14 21:02) [21]
> Юрий Зотов © (14.06.10 20:07) [16]
>
> > Здесь же вопрос выбора между прямым чтением из переменной
> и
> > геттером.
>
> Не это главное. В первом варианте мы сами храним значение
> свойства и никто "мимо нас" изменить его не может. Во втором
> варианте зачение свойства хранится в published - компоненте
> и его может изменить кто угодно, причем мы об этом и знать
> не будем.
Ну если мы обсуждаем не конкретный код, а подход в приниципе, то здесь нет предмета для обсуждения.
← →
antonn © (2010-06-14 22:03) [22]Всегда делаю второй, привычка
← →
Юрий Зотов © (2010-06-14 22:49) [23]Кнопка Button1 лежит на панели Panel1.
procedure TForm1.FormClick(Sender: TObject);
begin
Panel1.Visible := not Panel1.Visible;
Caption := BoolToStr(Button1.Visible, True)
end;
Облом-с. Кнопки не видно, а режим редактирования, получается, включен.
← →
Типа программист (2010-06-14 23:07) [24]Удалено модератором
← →
Юрий Зотов © (2010-06-14 23:13) [25]И тогда станешь типа программистом.
← →
абизяна (2010-06-14 23:16) [26]
> Юрий Зотов © (14.06.10 23:13) [25]
> И тогда станешь типа программистом.
:-)))
+1000
← →
Типа программист (2010-06-14 23:31) [27]Удалено модератором
← →
абизяна (2010-06-14 23:40) [28]
> Типа программист (14.06.10 23:31) [27]
Ай, да Гюльчетай! Сколько снобизма!
← →
Юрий Зотов © (2010-06-14 23:41) [29]
> Типа программист (14.06.10 23:31) [27]
Проще надо быть.
← →
Типа программист (2010-06-14 23:42) [30]Удалено модератором
← →
Юрий Зотов © (2010-06-14 23:43) [31]Еще одно подтверждение - какой бы ни была тема ветки, типа программист здесь всегда найдется.
← →
Типа программист (2010-06-14 23:48) [32]Удалено модератором
← →
Юрий Зотов © (2010-06-14 23:48) [33]Он же "работодатель", он же "В школу", он же... сказать?
← →
Типа программист (2010-06-14 23:48) [34]Удалено модератором
← →
абизяна (2010-06-14 23:49) [35]Удалено модератором
← →
В школу! (2010-06-14 23:56) [36]Удалено модератором
← →
картман © (2010-06-15 00:59) [37]Удалено модератором
← →
Германн © (2010-06-15 01:12) [38]
> Юрий Зотов © (14.06.10 22:49) [23]
>
> Кнопка Button1 лежит на панели Panel1.
>
> procedure TForm1.FormClick(Sender: TObject);
> begin
> Panel1.Visible := not Panel1.Visible;
> Caption := BoolToStr(Button1.Visible, True)
> end;
>
> Облом-с. Кнопки не видно, а режим редактирования, получается,
> включен.
Очень неудачный пример, если исходить из примера в сабже.
Но и его достаточно, чтобы присоединиться к sniknik © (14.06.10 19:28) [1].
Хотя бы в отношении разработке компонент vs разработке программы.
Думаю ясно почему я считаю этот пример неудачным.
← →
Плохиш © (2010-06-15 10:06) [39]Читал, читал ветку... Нет здесь никаких программистов. Настоящие программисты хранят такие значения в реестре, вындовс для того и придумано, чтобы за нашими значениями следить.
← →
@!!ex © (2010-06-15 10:15) [40]Второе - пример плохого кода.
То, что видимость кнопки связана с режимом редактирования не значит что эту видимость можно использовать для определения текущего режима.
Логику от интерфейса надо отделять.
← →
Александр Иванов © (2010-06-15 10:15) [41]Я стараюсь не делать свойсва, при изменении которых "что-то происходит". Т.е. если нужно вызвать действие - для этого служит процедура или функция.
Т.е. я бы сделал read-only свойство и процедуру, которая устанавливает значение.
← →
brother © (2010-06-15 10:18) [42]> Я стараюсь не делать свойсва, при изменении которых "что-
> то происходит".
зря...
> Т.е. я бы сделал read-only свойство и процедуру, которая
> устанавливает значение.
а процедура вызываемая "автоматом" это не тоже?
← →
Александр Иванов © (2010-06-15 10:31) [43]
> а процедура вызываемая "автоматом" это не тоже?
Нет. По коду сразу видно устанавливается ли значение или происходит набор действий.
> зря...
Содержательно.
Я свои доводы сказал. Если есть другие - приведи.
← →
antonn © (2010-06-15 12:04) [44]
> Читал, читал ветку... Нет здесь никаких программистов. Настоящие
> программисты хранят такие значения в реестре, вындовс для
> того и придумано, чтобы за нашими значениями следить.
Да к тому же нас посетили "Писатели". Речь не о хранении значения вне программы, а об организации изменения этого значения.
← →
Virgo_Style © (2010-06-15 12:09) [45]
> Да к тому же нас посетили "Писатели".
Не устаю удивляться, каким чудом писатели-сатирики и ирония появились до возникновения смайликов.
← →
Суслик__ (2010-06-15 12:13) [46]На мой взгляд все это не очень важно.
В любой программе есть набор предположений.
Поясню. Например, почему никого не смущает тот факт, что если функция возвращает ссылку на объект, то любой клиент может устроить бардар, вызвав Destroy у результата? Поэтому предполагается, что клиент не будет делать вызов Destroy.
Поэтому предположение, что нужно защищаться от того, чтобы никто не поменял Visible у кнопки, на мой взгляд несостоятельно. Необходимость данной защиты находится целиком в области мнительности разработчика. Я бы не стал защищаться. Недобросовестная третья сторона может натворить немало бед и при скрытом от нее EditButton.
← →
Суслик__ (2010-06-15 12:15) [47]
> Александр Иванов © (15.06.10 10:15) [41]
я вообще не пользуюсь свойствами.
не люблю их - нельзя сделать перегруженными, например.
поэтому метод сеттер и метод геттер.
не очень привычно для Дельфи, но зато ясно всегда кто чего меняет, а кто - нет.
← →
Virgo_Style © (2010-06-15 13:16) [48]
> его может изменить кто угодно, причем мы об этом и знать
> не будем
"Результатом автоматизации бардака всегда становится автоматизированный бардак" (c)
← →
Ega23 © (2010-06-15 13:20) [49]Всегда делал по первому варианту. На крайняк - и геттер писал, но в качестве результата всё равно приват-поле возвращал, а не Control.Visibe
← →
_Юрий © (2010-06-15 19:09) [50]Второй вариант концептуально неверен.
Мы принимаем решение о состоянии свойства по косвенным признакам.
Ни дай бог что-нибудь изменится в программе - и поехало.
А изменится обязательно.
← →
jack128_ (2010-06-15 23:23) [51]
> Суслик__ (15.06.10 12:13) [46]
дим, а private члены класса используешь?? Если да, то зачем??
← →
Медвежонок Пятачок © (2010-06-15 23:29) [52]Вариант номер три. Самый православный
type
TMyForm = class(TForm)
...
private
FEditMode: boolean;
public
end;
function DoMyEdit(AReadOnly : boolean) : boolean;
begin
Result := False;
with TMyForm.Create(Application) do
try
FEditMode := AReadOnly;
InitТамЧто-то_где-то;
Result := ShowModal = mrOk;
finally
Free;
end;
end;
1. Снаружи не паримся, об имени класса формы.
2. Снаружи не паримся над свойствами класса.
3. Снаружи просто знаем, что если надо отредактировать некую сущность, то надо просто вызвать некую ordinal функцию и все.
← →
Медвежонок Пятачок © (2010-06-15 23:41) [53]Здесь же вопрос выбора между прямым чтением из переменной и геттером.
Я бы ширше смотрел на проблему.
Если разработчик единственный, то оба варианта почти одинаковы.
Ничем таким не отличаются, чтобы мог возникнуть не то что холивар, а просто обсуждение.
Если же форму проектирует один, а другой ее использует, то оба варианта одинаково кривы.
Один разраб заставляет другого помнить имя класса и имя поля/свойства.
Второй навставлял в десяти местах вызовы формы (имеет право)
Первый по порефакторил класс (тоже имееет право) - поменял имена.
Второй меняет свои вызовы во всех десяти местах.
← →
Дмитрий Т (2010-06-16 01:01) [54]
> jack128_ (15.06.10 23:23) [51]
>
>
> > Суслик__ (15.06.10 12:13) [46]
>
> дим, а private члены класса используешь?? Если да, то зачем?
> ?
Плохой вопрос. В таком ключе можно задавать вопросы на любые темы ))
← →
_Юрий © (2010-06-16 19:48) [55]
>
> дим, а private члены класса используешь?? Если да, то зачем?
> ?
Следует отличать "защиту от дурака" от "зашиты от злоумышленника".
От второго невозможно защититься никак :-)
← →
KilkennyCat © (2010-06-16 19:52) [56]от первого тоже
← →
KilkennyCat © (2010-06-16 19:53) [57]даже наоборот, защититься от злоумышленника проще, ибо понятно от чего, а защита от дурака невозможна из-за абсолютной непредсказуемости действий дурака.
← →
DiamondShark © (2010-06-18 11:31) [58]
> Внимание - предлагается тема для холиварчика: какой стиль
> Вы предпочитаете и почему?
Тот, что с приватным полем.
Почему? Ну, например, вполне возможно представить некий дурной контрол, у которого свойство Visible возвращает не последнее присвоенное значение, а чего-то другое. Например, даже после присваивания true возвращает false пока невидим родительский контейнер.
Да мало ли чего ещё. Свойства -- это, всё-таки, штуки с сайдэффектами.
← →
Anatoly Podgoretsky © (2010-06-18 12:29) [59]> DiamondShark (18.06.2010 11:31:58) [58]
Свойства - это средства создания черного ящика. Никаких побочных эффектов
там нет, в отличии от параметров функций
← →
DiamondShark © (2010-06-18 12:41) [60]
> Anatoly Podgoretsky © (18.06.10 12:29) [59]
> Свойства - это средства создания черного ящика. Никаких
> побочных эффектов там нет
Если при изменении одного свойства, изменяется эннадцать других -- это побочный эффект, или это как-то по-другому называется?
> в отличии от параметров функций
Щито?
← →
Mystic © (2010-06-18 14:21) [61]Я обычно предпочитаю отдельно вводить метод UpdateUI, которые проставляет Enabled и Visible всем элементам на форме в одном месте. Ну а разница между вариантами I и II для меня не очень принципиальна. Получается примерно так:
type
TMyForm = class(TForm)
...
private
FEditMode: boolean;
FUpdateMessageInQueue: Boolean;
procedure SetEditMode(const Value: boolean);
public
property EditMode: boolean read FEditMode write SetEditMode;
end;
procedure TMyForm.SetEditMode(const Value: boolean);
begin
if FEditMode <> Value then
begin
FEditMode := Value;
NeedUpateUI();
end
end;
procedure TMyForm.UpdateUI();
begin
EditButton.Visible := EditMode;
end;
где
procedure TBaseForm.NeedUpdateUI();
begin
if FUpdateMessageInQueue then Exit;
PostMessage(Handle, MUM_UPDATE_UI, 0, 0);
FUpdateMessageInQueue := True;
end;
procedure TBaseForm.MumUpdateUI(var Message: TMessage); {message MUM_UPDATE_UI }
begin
UpdateUI();
FUpdateMessageInQueue := False;
end;
procedure TBaseForm.UpdateUI();
begin
end;
← →
Иксик © (2010-06-18 18:54) [62]DiamondShark © [60]
Оооо!! Приветствую! Мы тебя недавно вспоминали :)
← →
Kerk © (2010-06-18 19:13) [63]
> Mystic © (18.06.10 14:21) [61
А почему не проставлять значения по месту + Invalidate?
← →
jack128_ (2010-06-18 19:17) [64]
> Kerk © (18.06.10 19:13) [63]
представь что по этому сообщению TreeView перестраивается?
← →
Kerk © (2010-06-18 19:19) [65]
> jack128_ (18.06.10 19:17) [64]
Я, может, туплю, ибо давно с этим не сталкивался.
Но по-моему ведь Invalidate просто делает окно невалидным, а перерисуется оно, когда до WM_PAINT в очереди сообщений дело дойдет. Что, в общем, повторяет описанное Мистиком поведение. Нет?
← →
Kerk © (2010-06-18 19:23) [66]А да, похоже туплю. Если речь не о перерисовке, а о каких-то логических изменениях, то вопросов нет.
Страницы: 1 2 вся ветка
Текущий архив: 2010.09.12;
Скачать: CL | DM;
Память: 0.65 MB
Время: 0.013 c