powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Константа - не константа
25 сообщений из 27, страница 1 из 2
Константа - не константа
    #37139331
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходная ситуация: код Delphi, обычные соглашения о стиле кодирования.

Есть объект, многие аспекты поведения которого регулируются свойством, допустим, XYMode с возможными значениями xyMode1, xyMode2 и xyMode3 (в принципе расширяемо). С точки зрения бизнес-логики это атомарное свойство, мысль разбить на несколько свойств, регулирующих каждый из аспектов нелепа, с точки зрения реализации же в половине методов в той или иной форме должен присутствовать case XYMode of ...

Мне не хочется писать такие вот case, поэтому я поступил так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 type 
  TXYMode =  class 
   public 
     class   function  Something (..); virtual; abstract;
     { .. методы регулируют те самые аспекты .. } 
   end ;

  TXYModeClass =  class   of  TXYMode;

  TMainModule =  class 
  ..
   public 
     property  XYMode: TXYModeClass ..
   end ;

  xyMode1 =  class  (TXYMode)
    ..
  xyMode2 =  class  (TXYMode)
    ..
  xyMode3 =  class  (TXYMode)
    ..

Таким образом, в исходниках стоит

Код: plaintext
Module.XYMode := xyMode1;

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

1. Наверняка у такого подхода есть какое-нибудь название среди "стандартных паттернов", хотелось бы услышать. Просто чтобы при необходимости отослать туда.
2. Ваше мнение по поводу именования класса в стиле константы как следствия его употребления в коде вместо константы.

Бил программистов по голове. Поцарапал лом.
...
Рейтинг: 0 / 0
Константа - не константа
    #37139570
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer1. Наверняка у такого подхода есть какое-нибудь название среди "стандартных паттернов", хотелось бы услышать. Просто чтобы при необходимости отослать туда.Похоже на это .

softwarer2. Ваше мнение по поводу именования класса в стиле константы как следствия его употребления в коде вместо константы.Если средства языка позволяют - почему бы и нет.
В традиционном варианте, экземпляр юзается.
...
Рейтинг: 0 / 0
Константа - не константа
    #37139575
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer1. Наверняка у такого подхода есть какое-нибудь название среди "стандартных паттернов", хотелось бы услышать. Просто чтобы при необходимости отослать туда.паттерн "состояние" или "стратегия" , они похожи, если смотреть с этой стороны
...
Рейтинг: 0 / 0
Константа - не константа
    #37140267
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
softwarer,

исходники txmldocument:


TXMLDocument = class(TComponent, IInterface, IXMLDocument, IXMLDocumentAccess)
...
published
property DOMVendor: TDOMVendor read FDOMVendor write SetDOMVendor;
...
...

и в результате:

procedure TXMLDocument.SetActive(const Value: Boolean);
begin
...
FDOMDocument := DOMImplementation.createDocument ('', '', nil);
end;



это борланд.
...
Рейтинг: 0 / 0
Константа - не константа
    #37140346
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNose, боюсь, не вижу тут ничего похожего на исходный вопрос :)

Меч, егорыч - благодарю.
...
Рейтинг: 0 / 0
Константа - не константа
    #37140348
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
softwarereNose, боюсь, не вижу тут ничего похожего на исходный вопрос :) зря. там как раз по исходному вопросу, просто я не стал копипастить килобайты кода, который легко найти :)
...
Рейтинг: 0 / 0
Константа - не константа
    #37141802
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer2. Ваше мнение по поводу именования класса в стиле константы как следствия его употребления в коде вместо константы.
Красиво конечно, но как-то не то...
Лучше использовать паттерн "стратегия" в стандартном исполнении.
Тем более, что объект класса может создаватся с параметрами в конструкторе.
Решение не гибкое, получается.
Да и не нужно все задачи сводить к максимальному использовании свойств [property], не всегда это уместно, как мне кажется.
...
Рейтинг: 0 / 0
Константа - не константа
    #37142030
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SVТем более, что объект класса может создаватся с параметрами в конструкторе.
Резонно. Но мне как-то ни разу в жизни не требовалось создавать константу true или false с параметрами в конструкторе :)

MAYAKOV_SVДа и не нужно все задачи сводить к максимальному использовании свойств [property], не всегда это уместно, как мне кажется.
Безусловно. Я с интересом выслушаю альтернативные предложения в задаче "объекту должен задаваться режим работы (одно из трёх на текущий момент возможных значений); должна быть возможность узнать текущий режим работы объекта".
...
Рейтинг: 0 / 0
Константа - не константа
    #37142212
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Я с интересом выслушаю альтернативные предложения в задаче "объекту должен задаваться режим работы (одно из трёх на текущий момент возможных значений); должна быть возможность узнать текущий режим работы объекта".
Раз уж со свойствами, то может быть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TMainModule =  class 
  ..
   FXYMode : TXYMode;  // ссылка на объект стратегии 
   public 
     property  XYMode: TXYMode read FXYMode write WriteXYMode;
   end ;
 // сеттер для свойства 
 procedure  TMainModule.WriteXYMode(m : TXYMode);
 begin 
  if  FXYMode <>  nil   then  FXYMode.Free;
 FXYMode := m;
 end ;
Установка свойства так:
Код: plaintext
1.
 Module.XYMode := TXYMode1.Create(...);
Что касается своего опыта: когда создается абстрактный класс, а потом от него наследуются другие, то в конструкторах появляются различные параметры. Что резонно, т.к. добавляются новые переменные в классе. Для каждого подкласса список параметров может быть разный, поэтому, через какую-нибудь абстрактную функцию Init выкрутится по-нормальному не удастся.
Обычно стратегия сама по себе не работает, а пользуется ссылками на другие объекты.
Поэтому использование конструктора с параметрами - вполне обычное явление для паттерна "стратегия", хотя и не обязательная.
Хотя можно и обойтись и инструкцией case и обычым свойством, которой номер стратегии указывает. Тут нужно по ситуации смотреть.
...
Рейтинг: 0 / 0
Константа - не константа
    #37142271
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SVРаз уж со свойствами, то может быть так:
Может, но зачем? В результате вместо

Код: plaintext
 Module.XYMode := xyMode1;

мы имеем

Код: plaintext
 Module.XYMode := TXYMode1.Create(...);

Вместо

Код: plaintext
aMode1.Checked := (Module.XYMode = xyMode1);

мы имеем

Код: plaintext
aMode1.Checked := (Module.XYMode  is  TMYMode1);

И всё это ради того, чтобы, условно, иметь возможность параметризовать объект "год" количеством месяцев. Имхо неактуально.

Я понимаю, что в этом месте у читателя рефлекторно возникает желание сказать, мол, календарь бывает не только григорианский, и кое у кого бывает и 13 месяцев. Всё правильно, я, условно говоря, собираюсь создать классы ЮлианскийКалендарь, ГригорианскийКалендарь, ЕврейскийКалендарь, КалендарьМайа, подставлять их в нужное место и не вижу никакой причины их параметризовать, ни сейчас, ни в разумной перспективе
...
Рейтинг: 0 / 0
Константа - не константа
    #37142317
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerИмхо неактуально.
Мож я напутал чего, но подставляю я стратегию, поэтому путаница в терминах.
Module.XYStrategy := TXYStrategy1.Create(...);
Да и у атомарного свойства вряд ли может быть такое:
function Something (..); virtual; abstract;
Поэтому Вам нужно определится, что же Вам нужно реализовать: простое свойство или паттерн "стратегия"?
...
Рейтинг: 0 / 0
Константа - не константа
    #37142336
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SVПоэтому Вам нужно определится, что же Вам нужно реализовать: простое свойство или паттерн "стратегия"?
Что мне нужно реализовать, вроде бы вполне полно описано в первом посте топика. Могу точно сказать, что мне не нужно реализовывать паттерн, "стратегия" или какой иной. Мне нужно хорошо решить задачу, и я ничего не имею против, если найденное хорошее решение совпадёт с тем, что некие люди называют тем или иным паттерном.

MAYAKOV_SVДа и у атомарного свойства вряд ли может быть такое:
function Something (..); virtual; abstract;
Ну возьмите предыдущий пример с календарями и представьте себе методы

Код: plaintext
1.
 function  СколькоМесяцевВГоду (year: integer): integer; virtual; abstract;
 function  СколькоДнейВМесяце (year: integer): integer; virtual; abstract;

Вы предложите реализовать иначе?
...
Рейтинг: 0 / 0
Константа - не константа
    #37142790
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВы предложите реализовать иначе?
Да вообще по-разному можно, Ваш вариант вполне работоспособен.
Я конечно много лишнего тут понаписал, не сообразил сразу, не судите строго.
softwarerименования класса в стиле константы как следствия его употребления в коде вместо константы

Это меня и сбило с толку.
...
Рейтинг: 0 / 0
Константа - не константа
    #37142962
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Обджект паскаль не очень хорош для паттернов (
...
Рейтинг: 0 / 0
Константа - не константа
    #37143015
avb1003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer...
Код: plaintext
1.
...
 function  СколькоДнейВМесяце (year: integer): integer; virtual; abstract;

Вы предложите реализовать иначе?Мне всегда казалось, что нужно как-то так:
Код: plaintext
1.
...
 function  СколькоДнейВМесяце (year: integer; month: integer): integer; virtual; abstract;
Или у Вас "СколькоДнейВМесяце" - метод объекта "месяц" ?
...
Рейтинг: 0 / 0
Константа - не константа
    #37143027
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglsoftwarer,

Обджект паскаль не очень хорош для паттернов (Почему? И какой язык тогда "подходящий"?
...
Рейтинг: 0 / 0
Константа - не константа
    #37143349
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Меч,

В данном конкретном случае - возможностей Object Pascal достаточно.
Но удобнее будут и C# и D и Java.

Возможно, языки с динамической типизацией здесь (в паттернах) дадут фору всем остальным. Например Python.
...
Рейтинг: 0 / 0
Константа - не константа
    #37143401
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да. Если выбор варианта программы производится разработчиком, то еще же есть условная компиляция.

В Дельфи она в зачаточном состоянии,
в C++
#if defined(A) && !defined(B)

D позволяет уже CTFE и чуть более продвинутые
version(clientcode)
{
/// .....
}
...
Рейтинг: 0 / 0
Константа - не константа
    #37143547
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglОбджект паскаль не очень хорош для паттернов (
Cкорее, (стандартные) паттерны не очень хороши для обжект паскаля. Поскольку заточены под примитивные возможности с++-объектной модели.
...
Рейтинг: 0 / 0
Константа - не константа
    #37143586
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, у С++ нет ни объектной, ни какой другой модели, зато на С++ можно написать любую модель.
Понятие "стандартный" паттерн тоже, в общем-то не особо имеет смысл, кмк.
С пассажем Siemargla про обджект паскаль не согласен, потому что для паттернов достаточно иметь в языке поддержку наследования, больше ничего.
...
Рейтинг: 0 / 0
Константа - не константа
    #37143604
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerSiemarglОбджект паскаль не очень хорош для паттернов (
Cкорее, (стандартные) паттерны не очень хороши для обжект паскаля. Поскольку заточены под примитивные возможности с++-объектной модели.
Да можно реализовывать стандартные паттерны на обджект паскале.
Проблем особых нету, по крайней мере я не встречал серьезные трудности.
Паттерн - это идея, а реализуется она уже в соответствии со спецификой языка.
Просто обычно программисты, работающие на дельфи (из тех, котрых я видел), не очень активно используют ООП технологии, и стараются пользоваться по большей части возможностями среды разработки.
...
Рейтинг: 0 / 0
Константа - не константа
    #37143645
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychsoftwarer, у С++ нет ни объектной, ни какой другой модели, зато на С++ можно написать любую модель.
Никакой модели нет у машинного кода, ну это если не считать прорвы заточек на модель процессора. У ассемблера модель уже есть - например, в ней не предусмотрено использование части команды как другой команды. И так далее. Хотя, конечно, на инструменте любой модели можно написать инструмент, поддерживающий другую модель.
...
Рейтинг: 0 / 0
Константа - не константа
    #37143773
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerХотя, конечно, на инструменте любой модели можно написать инструмент, поддерживающий другую модель......более высокого уровня абстракции, я бы дополнил всё таки.
...
Рейтинг: 0 / 0
Константа - не константа
    #37143814
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych...более высокого уровня абстракции, я бы дополнил всё таки.
Не обязательно. Никто не мешает на С++ написать эмулятор процессора Intel 4004.
...
Рейтинг: 0 / 0
Константа - не константа
    #37143974
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwareregorych...более высокого уровня абстракции, я бы дополнил всё таки.
Не обязательно. Никто не мешает на С++ написать эмулятор процессора Intel 4004.пожалуй, да, соглашусь
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Константа - не константа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]