Форум: "Прочее";
Текущий архив: 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