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

Вниз

А вот еще один холиварчик по поводу стиля кодинга   Найти похожие ветки 

 
Юрий Зотов ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
15-1276427298
Я всегда говорил!
2010-06-13 15:08
2010.09.12
Бывают же наглые работодатели


2-1277059445
Delphist2
2010-06-20 22:44
2010.09.12
savedialog


15-1269882677
Piter
2010-03-29 21:11
2010.09.12
Установка windows на ноутбук без мышки


2-1276588631
_REA
2010-06-15 11:57
2010.09.12
AnsiChar constant


15-1275932643
test
2010-06-07 21:44
2010.09.12
База данных Delphi?





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