Как передавать объект в метод

Передавать объект целиком или только необходимые проперти. Почему не нужно спорить какой подход правильный.

Про функции на swift.org

Проблема

Представьте что у вас есть метод, вычисляющий возраст у объекта `Car`:

/*
Обратите внимание, класс `Car` имеет несколько проперти.
*/
class Car {

    var id: String
    var model: String
    var birthday: Date
}

static func age(/* Проблема здесь */) -> Int {
    return Calendar.current.dateComponents([.year], from: self, to: *Объект даты*).year!
}

Методу `age` для работы нужна только дата, остальные проперти класса `Car` не важны. Есть два конкурирующих подхода.

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

static func age(from birthday: Date) -> Int { ... }

Сторонники второго подхода утверждают что в метод нужно передавать весь объект. Это сохраняет обстракцию и предупреждает будущие изменения. Например, появится дата списания в утиль - считать возраст машины придется не до текущей даты, а до даты списания.

static func age(for car: Car) -> Int { ... }

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

Решение

Оба подхода не нарушают код-стайл и делают свою работу. А значит по этим пунктам отбросить неработающий вариант не получится. Считать количество символов - такая же глупость, как спорить про Swift и SwiftUI.

Давайте взглянем на абстрацию. Если метод ожидает конкретные проперти, которые случайно оказались в одном объекте - передавайте их в метод по отдельности. Если же элементы данных принадлежат конкретному объекту и неотделимы, а функция при этом не универсальная - то раскрывая элементы вы нарушаете абстрацию. В этом случае передавайте объект целиком.

Решение для примера выше вариант можете написать в комментариях к посту телеграм канале.