В настоящее время я работаю над базой кода, которая имеет много классов, которые реализуют метод Start. Мне кажется, что это двухфазная конструкция, которую я всегда считал плохой практикой. Я не могу сказать разницу между этим и конструктором.
Когда целесообразно использовать метод запуска вместо обычной конструкции объекта?
Когда мне лучше использовать конструктор?
Редактировать: я не думаю, что это актуально, но язык программирования - C #, он может в равной степени относиться к Java или C ++
object-oriented-design
construction
constructors
Дэйв Хиллиер
источник
источник
start
конструктором и? и т. д.init
метод внеnew
функции - perldoc.perl.org/perlobj.html . Идиомы одного языка могут хорошо работать там, а не на других языках.Start
методами в общих API включают потоки и секундомеры.Ответы:
Start()
Метод (напримерRun()
,Execute()
или что - нибудь подобное) уместно , когда стоимость строительства объекта является низкой, но стоимость используя его высока. Например: класс, который инкапсулирует алгоритм оптимизации наилучшего пути. Тривиально настроить его с помощью набора параметров (X
квадраты наY
квадраты, с таким и таким методом оценки), но выполнение может занять некоторое время. Если вы хотите создать 20 из этих объектов, вы можете отложить выполнение до тех пор, пока все они не будут созданы - например, это позволяет упростить их распараллеливание.В качестве альтернативы, это может быть полезно, когда вы не знаете, когда будет необходим запуск объекта - возможно, потому, что он основан на пользовательском вводе или логике, которая выбирает из списка возможностей.
Это предполагает, конечно, что
Start()
это полезный метод объекта, а не эквивалентInitialize()
метода. Если это просто дополнительный способ установить больше параметров, он не должен существовать.источник
Code Complete (и многие другие ресурсы по разработке программного обеспечения) подчеркивают соответствие ваших классов объектам реального мира. Я полагаю, что фундаментальная причина этого заключается в том, что это повышает вероятность того, что вы действительно понимаете, что именно вы реализуете, а не разбиваете на нематериальную идею.
Если вы подписаны на эту теорию, я не вижу ничего плохого в добавлении
Start()
метода к любому классу, который должен, будь то реальный объект, также иметь состояние покоя. Если для вашего объекта не имеет смысла существовать, пока он не запущен (или вообще не имеет смысла для вашего объекта работать), то я бы сказал, что это плохая практика.источник
Start()
может соответствовать либо переключателю включения / выключения (например, выключателю освещения), который затем должен иметьStop()
, либо кнопке (например, кнопке «Печать» на копировальном аппарате), где он срабатывает, а затем запускается до завершения.Вы можете использовать ленивую инициализацию.
Таким образом, вы избегаете временной привязки, то есть потребитель вашего класса должен вызывать определенные методы в определенном порядке. Необходимость
start()
сначала позвонить - это способ узнать, как класс работает внутри, что плохо, потому что вы можете изменить это в будущем.Отложите дорогостоящую инициализацию, пока она не понадобится
Пример:
источник