Я немного спорю с моим другом о том, являются ли эти две практики просто двумя сторонами одной медали, или же одна из них действительно лучше.
У нас есть функция, которая принимает параметр, заполняет его член и затем возвращает его:
Item predictPrice(Item item)
Я считаю, что, поскольку он работает с тем же объектом, который передается, нет смысла возвращать элемент. Фактически, во всяком случае, с точки зрения вызывающего абонента, это сбивает с толку вопросы, поскольку вы можете ожидать, что он вернет новый элемент, а это не так.
Он утверждает, что это не имеет значения, и даже не имеет значения, создаст ли он новый Предмет и вернет его. Я категорически не согласен по следующим причинам:
Если у вас есть несколько ссылок на элемент, передаваемый (или указатели, или что-то еще), он выделяет новый объект и возвращает его, что имеет материальное значение, так как эти ссылки будут неправильными.
В языках, не управляемых памятью, функция, выделяющая новый экземпляр, претендует на владение памятью, и, таким образом, нам пришлось бы реализовать метод очистки, который вызывается в какой-то момент.
Выделение в куче потенциально дорого, и поэтому важно, чтобы вызываемая функция это делала.
Следовательно, я считаю, что очень важно иметь возможность видеть через сигнатуру метода, изменяет ли он объект или выделяет новый. В результате я считаю, что поскольку функция просто изменяет переданный объект, подпись должна быть:
void predictPrice(Item item)
В каждой кодовой базе (по общему признанию кодовой базы C и C ++, а не Java, на которой мы работаем), вышеуказанный стиль по существу придерживался и придерживался значительно более опытными программистами. Он утверждает, что, поскольку мой размер выборки кодовых баз и коллег небольшой из всех возможных кодовых баз и коллег, и, таким образом, мой опыт не является истинным показателем того, является ли кто-то лучшим.
Итак, есть мысли?
Item
есть class Item ...
и нет typedef ...& Item
, то местный item
уже копия