У мене з товаришем трохи дискутують про те, чи є ці дві практики лише двома сторонами однієї монети, чи чи справді краща.
У нас є функція, яка приймає параметр, заповнює його член, а потім повертає його:
Item predictPrice(Item item)
Я вважаю, що оскільки він працює над тим самим об’єктом, який передається, немає сенсу повертати предмет. Насправді, якщо що, з точки зору абонента, це плутає питання, оскільки ви могли очікувати, що він поверне новий елемент, який він не робить.
Він стверджує, що це не має ніякого значення, і навіть не має значення, чи створив би новий пункт і поверне його. Я категорично не згоден з наступних причин:
Якщо у вас є кілька посилань на пропуск елемента (або вказівники чи будь-що інше), виділення нового об'єкта та повернення його має матеріальне значення, оскільки ці посилання будуть невірними.
У мовах, що не управляються пам’яттю, функція, що виділяє новий примірник, вимагає володіння пам’яттю, і тому нам доведеться реалізувати метод очищення, який викликається в якийсь момент.
Розподіл на купі потенційно дорогий, і тому важливо, чи робить це викликана функція.
Отже, я вважаю, що дуже важливо мати можливість бачити через підпис методів, чи модифікує об'єкт, чи виділяє новий. Як результат, я вважаю, що оскільки функція просто модифікує переданий об'єкт, підпис повинен бути:
void predictPrice(Item item)
У кожній базі коду (правда, C і C ++ баз кодів, а не Java, якою є мова, з якою ми працюємо), з якою я працював, вищезгаданий стиль, по суті, дотримувався і дотримувався значно досвідченіших програмістів. Він стверджує, що мій вибірковий розмір кодових баз і колег є малим з усіх можливих баз коду та колег, і тому мій досвід не є істинним показником того, чи є хто з них вище.
Отже, якісь думки?
Item
є, class Item ...
а ні typedef ...& Item
, місцева item
вже копія