Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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]

Второе - пример плохого кода.
То, что видимость кнопки связана с режимом редактирования не значит что эту видимость можно использовать для определения текущего режима.
Логику от интерфейса надо отделять.



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

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

Наверх




Память: 0.57 MB
Время: 0.01 c
2-1274820470
HRustBB
2010-05-26 00:47
2010.09.12
Как в TreeView определить область видимости


2-1276497223
tippa
2010-06-14 10:33
2010.09.12
про 2 потока и общий стринглист


2-1276760149
john-s
2010-06-17 11:35
2010.09.12
Не могу добавить данные типа float в mysql


15-1276877562
Кто б сомневался
2010-06-18 20:12
2010.09.12
Поиск кода в гугл labs


6-1214928416
kernel
2008-07-01 20:06
2010.09.12
IdHTTPProxyServer и размер ресурса