Измените значение параметра внутри метода, это анти-шаблон?

Так что-то вроде этого

public void MyMethod(object parameter)
//....
    BuildSomething(parameter);
    BuildLayers(parameter);
    BuildOtherStuff(parameter);
}

public void BuildSomething(object parameter)
{
//...
    parameter.SomeProperty = "sadsd";
//...
}

Если это анти-шаблон, что он называется? Проблема (возможно) заключается в том, что вы неявно меняете параметр и используете измененное значение.
Я просто хочу знать, что этот анти-шаблон знает как

благодаря

8
nl ja de
@sll, где этот падает. Он либо не говорит, что он делает, либо имя метода - BuildSomethingwithLayersBuiltFromOtherStuff.
добавлено автор Tony Hopkinson, источник
Я считаю, что это нормально, если имя метода указывает, что он делает
добавлено автор sll, источник

3 ответы

Это побочный эффект .

Обычно они не являются хорошими и считаются запахами кода, поскольку это затрудняет разбор и понимание кода.

Однако эта схема иногда полезна.

C # кодифицировал ключевые слова ref и out специально , чтобы показать, что ожидается, что у метода будут побочные эффекты.

16
добавлено
@ knaki02 Я не думаю, что так ... определение очень ясно: функция или выражение, как говорят, имеют побочный эффект, если в дополнение к возврату значения он также изменяет некоторое состояние или имеет наблюдаемое взаимодействие с вызовом функций или внешнего мира .
добавлено автор Leonardo, источник
Это побочный эффект, потому что он меняет аргумент, и неясно, что это то, что делает этот метод. Неважно, что говорят некоторые ученые, void DoSomethingTo (arg) - это не DoSomethingWith (arg).
добавлено автор Tony Hopkinson, источник
теоретически, void - это возвращаемое значение. это тип содержит только одно значение, и это похоже на единицу в F #. в C# вы не можете присвоить его чему-либо. в чисто функциональном смысле метод, возвращающий пустоту, не имеет смысла или просто неинтересен, он вообще не эквивалентен коду. он может быть полезен только в том случае, если он имеет некоторые побочные эффекты. как и этот ответ, понятно, что побочные эффекты могут быть сложными, и это одна из причин, по которой очень важно следовать императивному коду, не зная всей или большой части системы.
добавлено автор kai, источник
Насколько я могу видеть, что параметр параметр изменился, является наблюдаемым взаимодействием с внешним миром
добавлено автор roundcrisis, источник
Возвращение результата недействительности не означает побочного эффекта, так же как и невоидные возвращаемые типы не подразумевают чистоту. Просто так происходит, что void содержит только одно значение (NULL), поэтому он не содержит информации о времени выполнения (в отличие, скажем, от bools, которые содержат 1 бит). Одно место, где полезно обходить пустоты, - это реализовать интерфейс, параметризованный по типу (т. Е. Используя экзистенциальные типы). Например, наш интерфейс может быть параметризован по типу «Конфигурация» и требует, чтобы мы реализовали функцию «getConfig: void -> Config»; если наша реализация неконфигурируема, мы можем использовать void как Config.
добавлено автор Warbo, источник
Это побочный эффект, когда метод не является недействительным ...
добавлено автор knaki02, источник
Как насчет «в дополнение к возврату ценности»? Метод Пустоты - нет.
добавлено автор knaki02, источник

Предполагая, что тип параметра не является object , а скорее является типом класса, который содержит свойство записи или поле, называемое SomeProperty ), тогда, когда метод входит, значение параметра будет идентификатором некоторого объекта (скажем, 459 192-й объект, созданный с момента запуска программы). Насколько я могу судить, значение этого параметра (что означает identity объекта, к которому он относится) будет оставаться одинаковым во всем методе.

Изменение значения переданного параметра (например, выражение parameter = someOtherObject ) может быть запахом кода , если метод не является достаточно малым, что очевидно, что происходит.

0
добавлено

У меня другая точка зрения.

Несмотря на небольшие проблемы, которые изменяют значение параметра, могут появиться в процессе отладки или чтения кода, мне не имеет смысла называть эту практику «анти-шаблоном».

Основываясь на современных проектах OO-языков, таких как Java или C#, я поддерживаю идею о том, что если это уродливо, неправильно или не рекомендуется изменять значения параметров, они бы сделали определенные параметры типа как копия экземпляров , а не ссылки .

И не соглашаясь с тем, что сказал Одед, я думаю, что ключевое слово ref или out должно использоваться только в тех контекстах, где вы действительно хотите изменить значение всего экземпляра, полностью заменить его . Чтобы использовать одно из этих ключевых слов, просто чтобы сказать «эй парень, значения параметров могут меняться во время исполнения стека» звучит немного неосторожно для меня. Что делать, если один из ваших клиентов видит подпись функции и действительно считает, что он может заменить всю вещь? (в ситуации, которая не ожидается).

0
добавлено
Я бы предпочел видеть ref или out на основе примера op как MyObject DoSomethingWith (MyObject oldObj); намного яснее. Как по существу кодер обслуживания, я ненавижу побочные эффекты. И если это выход или ref, они могут заменить все, они знают, что код должен справиться с этим. Не веря, что метод изменит аргумент, это гораздо более серьезная проблема в моем опыте, это должно быть только изменение класса, к которому передается аргумент.
добавлено автор Tony Hopkinson, источник
Это пахнет догмой и грузовым культом для меня ru.wikipedia.org/wiki/Argument_from_authority
добавлено автор Warbo, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot