Есть ли недостаток, чтобы вернуть это вместо void?

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

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

myObj.Update();
var val = myObj.GetCurrentValue();

вы сможете комбинировать две строки, чтобы сказать

var val = myObj.Update().GetCurrentValue();

РЕДАКТИРОВАТЬ: Я попросил нижеследую по прихоти, в ретроспективе, я согласен с тем, что это может быть ненужным и усложняющим, однако мой вопрос относительно возвращения этого, а не пустоты стоит.

Относительно примечания, что вы, ребята, думаете о том, что язык содержит новый бит синтаксического сахара:

var val = myObj.Update()<.GetCurrentValue();

У этого оператора будет низкий порядок приоритета, поэтому myObj.Update() выполнит сначала, а затем вызовет GetCurrentValue() на myObj вместо void return Update.

По существу я представляю себе оператора, который скажет: "Назовите метод в правой части оператора на первом действительном объекте слева". Любые мысли?

Ответ 1

Я знаю, что на Java они действительно думают об этом стандартном поведении для методов void. Если вы это сделаете, вам не понадобится дополнительный синтаксический сахар.

Единственным недостатком, о котором я могу думать, является производительность. Но это легко измерило. Я вернусь к вам с результатами за несколько минут: -)

Edit:

Возвращение ссылки немного медленнее, чем возврат void.. какой сюрприз. Так что единственный недостаток. Еще несколько тиков при вызове вашей функции.

Ответ 2

Я думаю, что в качестве общей политики это просто не имеет смысла. Цепочка метода таким образом работает с правильно определенным интерфейсом, но подходит только в том случае, если он имеет смысловой смысл.

Ваш пример является простым, если он не подходит, потому что он не имеет смыслового смысла.

Аналогично, ваш синтаксический сахар не нужен с правильно разработанным свободным интерфейсом.

Свободные интерфейсы или цепочка методов могут работать очень хорошо, но их нужно тщательно спроектировать.

Ответ 3

Разве это не так, как строятся "плавные интерфейсы" - как те, которые использует JQuery? Предполагается, что одним из преимуществ является читаемость кода (хотя запись wikipedia в http://en.wikipedia.org/wiki/Fluent_interface упоминает, что некоторые считают ее НЕ читаемой). Еще одно преимущество заключается в сложности кода, вы теряете необходимость устанавливать свойства в 7 строках кода, а затем вызывать метод для этого объекта в 8-й строке.

Мартин Фаулер (который придумал здесь термин - http://martinfowler.com/bliki/FluentInterface.html) говорит, что существует более свободно интерфейсы, чем цепочка методов, однако метод цепочка является общей методикой для использования с плавными интерфейсами.

EDIT: Я действительно возвращался сюда, чтобы отредактировать мой ответ и добавить, что нет недостатка в том, чтобы вернуть это вместо пустоты любым измеримым способом, когда я увидел комментарий Джорджа, указывающее, что я забыл обсудить вопрос. Извините за начальную "бессмысленную" бессвязность.

Ответ 4

Возвращение "self" или "this" является общим шаблоном, иногда называемым "chain chaining" . Что касается предложенного вами синтаксического сахара, я не уверен. Я не парень .NET, но для меня это не очень полезно.

Ответ 5

Структура NeXTSTEP Objective-C, используемая для использования этого шаблона. Это было прекращено в этой структуре, когда распределенные объекты (в основном, удаленные вызовы процедур) были добавлены в язык - функция, которая возвращала self, должна была быть синхронным вызовом, так как система распределенных объектов увидела тип возврата и предположила, что вызывающий должен знать результат функции.

Ответ 6

Единственный недостаток, который я вижу, заключается в том, что он делает API немного более запутанным. Скажем, у вас есть объект коллекции с методом remove(), который обычно возвращает void. Теперь вы хотите вернуть ссылку на саму коллекцию. Новая подпись будет выглядеть так:

public MyCollection remove(Object someElement)

Просто глядя на подпись, не ясно, что вы возвращаете ссылку на тот же экземпляр. Возможно, MyCollection неизменен, и вы возвращаете новый экземпляр. В некоторых случаях, например, здесь вам понадобится внешняя документация, чтобы прояснить это.

Мне действительно нравится эта идея, и я считаю, что были некоторые разговоры о переоснащении всех void-методов в Java7, чтобы вернуть ссылку на 'this', но в конечном итоге она провалилась.

Ответ 7

На первый взгляд это может выглядеть хорошо, но для согласованного интерфейса вам понадобится, чтобы все методы возвращали ссылку на это (у которого есть свои проблемы).

Скажем, у вас есть класс с двумя методами GetA, которые возвращают это и GetB, которые возвращают другой объект:

Затем вы можете вызывать obj.GetA(). GetB(), но не obj.GetB(). GetA(), который по крайней мере не кажется последовательным.

С помощью Pascal (и Visual Basic) вы можете вызывать несколько методов одного и того же объекта.

with obj
  .GetA();
  .GetB();
end with;

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