Я программирую на Java, и я всегда делаю конвертеры вроде этого:
public OtherObject MyObject2OtherObject(MyObject mo){
... Do the conversion
return otherObject;
}
На новом рабочем месте шаблон:
public void MyObject2OtherObject(MyObject mo, OtherObject oo){
... Do the conversion
}
Для меня это немного вонючий, так как я привык не менять входящие параметры. Является ли это изменение входящего параметра антипаттерном или это нормально? Есть ли у него серьезные недостатки?
java
clean-code
anti-patterns
CsBalazsHungary
источник
источник
oo
это объект, который передается методу, а не указатель на новый объект. Это тот случай, здесь? Если это Java, то, вероятно, это так, если это C ++, это может быть не такОтветы:
Это не антипаттерн, это плохая практика.
Разница между антипаттерном и простой плохой практикой здесь: определение анти-паттерна .
В соответствии с чистым кодексом дяди Боба, новый стиль рабочего места, который вы демонстрируете, является плохой практикой , рудиментарным или до ООП времени.
источник
OtherObject
это интерфейс? Только вызывающий абонент (надеюсь) знает, какого именно типа он хочет.Цитирую знаменитую книгу Роберта К. Мартина «Чистый код»:
Второй шаблон нарушает оба правила, в частности правило «выходной аргумент». В этом смысле он хуже первого паттерна.
источник
Вторая идиома может быть быстрее, потому что вызывающая сторона может повторно использовать одну переменную в длинном цикле вместо каждой итерации, создавая новый экземпляр.
Я бы вообще не использовал его, но например. в программировании игр это имеет свое место. Например, посмотрите на множество операций JavaMonkey Vector3f, позволяющих передать экземпляр, который должен быть изменен и возвращен как результат.
источник
Я не думаю, что это две эквивалентные части кода. В первом случае вы должны создать
otherObject
. Вы можете изменить существующий экземпляр во втором. У обоих есть его использование. Кодовый запах предпочтет один другому.источник
Это действительно зависит от языка.
В Java вторая форма может быть антишаблоном, но некоторые языки по-разному обрабатывают передачу параметров. В Ada и VHDL, например, вместо того , чтобы проход по значению или по ссылке, параметры могут иметь режимы
in
,out
, илиin out
.Изменение
in
или чтениеout
параметра является ошибкой , но любые измененияin out
параметра передаются обратно вызывающей стороне.Таким образом, две формы в Аде (это также законные VHDL)
а также
Оба имеют свое применение; процедура может возвращать несколько значений в нескольких
Out
параметрах, а функция может возвращать только один результат. Поскольку назначение второго параметра четко указано в объявлении процедуры, не может быть никаких возражений против этой формы. Я склонен предпочесть функцию для удобочитаемости. но будут случаи, когда процедура лучше, например, когда вызывающий объект уже создал объект.источник
Это действительно кажется вонючим, и, не видя больше контекста, невозможно сказать наверняка. Может быть две причины для этого, хотя есть альтернативы для обоих.
Во-первых, это краткий способ реализовать частичное преобразование или оставить результат со значениями по умолчанию, если преобразование не удалось. То есть вы можете иметь это:
Конечно, обычно это обрабатывается с использованием исключений. Однако, даже если по какой-либо причине необходимо избегать исключений, есть лучший способ сделать это - шаблон TryParse является одним из вариантов.
Другая причина заключается в том, что это может быть сделано из соображений непротиворечивости, например, это часть общедоступного API, где этот метод используется для всех функций преобразования по любой причине (например, для других функций преобразования, имеющих несколько выходов).
Java не очень хорошо справляется с несколькими выходными данными - она не может иметь параметры только для вывода, такие как некоторые языки, или иметь несколько возвращаемых значений, как другие, - но, тем не менее, вы можете использовать возвращаемые объекты.
Причина последовательности довольно слабая, но, к сожалению, она может быть самой распространенной.
источник
Преимущество второго шаблона заключается в том, что он заставляет вызывающую сторону брать на себя ответственность и ответственность за созданный объект. Нет сомнений в том, что метод создал объект или получил его из пула многократного использования. Звонящий знает, что он отвечает за срок службы и утилизацию нового объекта.
Недостатками этого способа являются:
OtherObject
ему нужен, и составить его заранее.MyObject
.OtherObject
должен быть конструируемым, не зная оMyObject
.Ответ основан на моем опыте в C #, я надеюсь, что логика переводит на Java.
источник
Учитывая свободную семантику - это
myObjectToOtherObject
может означать, что вы перемещаете некоторые данные из первого объекта во второй или полностью преобразуете его, второй метод кажется более подходящим.Однако, если бы имя метода было
Convert
(как и должно быть, если мы посмотрим на часть «... сделать преобразование»), я бы сказал, что второй метод не имеет никакого смысла. Вы не конвертируете значение в другое значение, которое уже существует, IMO.источник