Метод цепочки - почему это хорошая практика или нет?

Просто используйте numpy.clip() ( doc ):

n = np.clip(n, minN, maxN)

Он также работает для целых массивов:

my_array = np.clip(my_array, minN, maxN)

141
задан Ilari Kajaste 9 July 2009 в 13:44
поделиться

8 ответов

Согласен, это субъективно. По большей части я избегаю связывания методов, но недавно я также обнаружил случай, когда это было правильным решением - у меня был метод, который принимал примерно 10 параметров и нуждался в большем, но в большинстве случаев вам нужно было только указать несколько. С переопределением это очень быстро стало очень громоздким. Вместо этого я выбрал метод цепочки:

MyObject.Start()
    .SpecifySomeParameter(asdasd)
    .SpecifySomeOtherParameter(asdasd)
    .Execute();

Это что-то вроде фабричного паттерна. Подход с использованием цепочки методов был необязательным, но он упростил написание кода (особенно с IntelliSense). Имейте в виду, что это единичный случай, который не является общей практикой в ​​моем коде.

Дело в том, что в 99% случаев вы, вероятно, можете справиться так же хорошо или даже лучше без объединения методов. Но есть 1%, где это лучший подход.

71
ответ дан 23 November 2019 в 22:36
поделиться

Это кажется своего рода субъективным.

Цепочка методов - это не то, что изначально плохо или хорошо, imo.

Читаемость - самая важная вещь.

(Также учтите, что наличие больших количество связанных методов сделает вещи очень хрупкими, если что-то изменится)

6
ответ дан 23 November 2019 в 22:36
поделиться

На мой взгляд, цепочка методов - это немного новинка. Конечно, выглядит круто, но я не вижу в этом никаких реальных преимуществ.

Как:

someList.addObject("str1").addObject("str2").addObject("str3")

лучше, чем:

someList.addObject("str1")
someList.addObject("str2")
someList.addObject("str3")

Исключение может быть, когда addObject () возвращает новый объект, и в этом случае несвязанный код может быть немного более громоздким, например:

someList = someList.addObject("str1")
someList = someList.addObject("str2")
someList = someList.addObject("str3")
20
ответ дан 23 November 2019 в 22:36
поделиться

Это опасно, потому что вы можете зависеть от большего количества объектов, чем ожидалось, например, тогда ваш вызов возвращает экземпляр другого класса:

Я приведу пример:

foodStore - это объект, состоящий из множества принадлежащих вам продуктовых магазинов. foodstore.getLocalStore () возвращает объект, содержащий информацию о ближайшем к параметру хранилище. getPriceforProduct (что угодно) - это метод этого объекта.

Итак, когда вы вызываете foodStore.getLocalStore (parameters) .getPriceforProduct (something)

, вы зависите не только от FoodStore, как вы, но и от LocalStore.

] Если getPriceforProduct (что-либо) когда-либо изменится, вам нужно изменить не только FoodStore, но и класс, который вызывал цепной метод.

Вы всегда должны стремиться к слабой связи между классами.

При этом, я лично люблю соединяйте их в цепочку при программировании Ruby.

8
ответ дан 23 November 2019 в 22:36
поделиться

Мартин Фаулер имеет хорошее обсуждение здесь:

Объединение методов

Когда его использовать

Объединение методов может многое добавить читаемости внутреннего DSL и в результате стал почти synonum для внутренних DSL в некоторых умы. Лучше всего использовать цепочку методов, однако, когда он используется вместе с другими комбинациями функций.

Цепочка методов особенно эффективен с такими грамматиками, как parent :: = (это | то) *. Использование разных методы обеспечивают читаемый способ видя, какой аргумент будет следующим. Точно так же необязательные аргументы могут быть легко пропустить с помощью метода Цепочка. Список обязательных пунктов, например, parent :: = first second не так хорошо работают с основной формой, хотя это может быть хорошо поддержано с использованием прогрессивных интерфейсов. Большинство время, когда я бы предпочел вложенную функцию для этого случая.

Самая большая проблема для Method Цепочка - это проблема отделки. Хотя есть обходные пути, обычно если вы столкнетесь с этим, вам будет лучше используя вложенную функцию. Вложенный Функция также является лучшим выбором, если вы попадаете в неприятную ситуацию с Переменные контекста.

23
ответ дан 23 November 2019 в 22:36
поделиться

Многие используют цепочку методов как форму удобства, а не думают о каких-либо проблемах с удобочитаемостью. Цепочка методов приемлема, если она включает выполнение одного и того же действия с одним и тем же объектом, но только если она действительно улучшает читаемость, а не только для написания меньшего количества кода.

К сожалению, многие используют цепочку методов в соответствии с примерами, приведенными в вопросе. Хотя их можно сделать читаемыми, они, к сожалению, вызывают сильную связь между несколькими классами, поэтому это нежелательно.

6
ответ дан 23 November 2019 в 22:36
поделиться

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

foo.setHeight(100).setWidth(50).setColor('#ffffff');
foo.moveTo(100,100).highlight();

Я не использую его, когда один или несколько связанных в цепочку в моем примере методы вернут любой объект, кроме foo. Хотя синтаксически вы можете связать что угодно, если вы используете правильный API для этого объекта в цепочке, изменение объектов IMHO делает вещи менее читаемыми и может сбивать с толку, если API для разных объектов имеют какое-либо сходство. Если в конце вы вызовете какой-нибудь действительно распространенный метод ( .toString () , .print () , что угодно), на какой объект вы в конечном итоге воздействуете? Кто-то, случайно читающий код, может не уловить, что это будет неявно возвращенный объект в цепочке, а не исходная ссылка.

Объединение различных объектов в цепочку также может привести к неожиданным нулевым ошибкам. В моих примерах, предполагая, что foo является допустимым, все вызовы методов являются «безопасными» (например, действительными для foo). В примере OP:

participant.getSchedule('monday').saveTo('monnday.file')

... нет гарантии (как сторонний разработчик, смотрящий на код), что getSchedule действительно вернет действительный, ненулевой объект расписания. Кроме того, отладка этого стиля кода часто бывает намного сложнее, поскольку многие IDE не будут оценивать вызов метода во время отладки как объект, который вы можете проверить. ИМО, в любое время, когда вам может понадобиться объект для проверки в целях отладки, я предпочитаю иметь его в явной переменной.

В примере OP:

participant.getSchedule('monday').saveTo('monnday.file')

... нет гарантии (как сторонний разработчик, смотрящий на код), что getSchedule действительно вернет действительный, ненулевой объект расписания. Кроме того, отладка этого стиля кода часто бывает намного сложнее, поскольку многие IDE не будут оценивать вызов метода во время отладки как объект, который вы можете проверить. ИМО, в любое время, когда вам может понадобиться объект для проверки в целях отладки, я предпочитаю иметь его в явной переменной.

В примере OP:

participant.getSchedule('monday').saveTo('monnday.file')

... нет никакой гарантии (как сторонний разработчик, смотрящий на код), что getSchedule действительно вернет действительный, ненулевой объект расписания. Кроме того, отладка этого стиля кода часто бывает намного сложнее, поскольку многие IDE не будут оценивать вызов метода во время отладки как объект, который вы можете проверить. ИМО, в любое время, когда вам может понадобиться объект для проверки в целях отладки, я предпочитаю иметь его в явной переменной.

38
ответ дан 23 November 2019 в 22:36
поделиться

Цепочка методов может быть просто новинкой для большинства случаев, но я думаю, что она имеет свое место. Один пример можно найти в Использование Active Record в CodeIgniter :

$this->db->select('something')->from('table')->where('id', $id);

Это выглядит намного чище (и имеет больше смысла, на мой взгляд), чем:

$this->db->select('something');
$this->db->from('table');
$this->db->where('id', $id);

Это действительно субъективно; У каждого свое мнение.

3
ответ дан 23 November 2019 в 22:36
поделиться