Evgeniy
но именно в примере это лишняя зависимость
Sergey
Sergey
откуда у тебя интерфейс взялся
Evgeniy
геокордината это обычный объект же
Evgeniy
который хранит координаты
Sergey
любой! публичный метод или свойство составляют интерфейс объекта
Sergey
и интерфейс должен быть удобным и простым
Evgeniy
определение дистанции между 2 координатами надо стараться сделать в отдельном объекте
Sergey
явно описывая что и зачем
Sergey
а не как
Sergey
Evgeniy
ну в примере у тебя у координат определение дистанции
Evgeniy
зачем в простом объекте по хранению координат держать логику
Sergey
потому что в этом суть ООП
Sergey
данные и логика по обработке этих данных должны лежать вместе
Sergey
инкапсуляция и все такое
Evgeniy
у тебя там только один объект GeoCordinat ?
Evgeniy
больше никаких объектов ?)
Evgeniy
делаем GodObject ?
Sergey
у каждого объекта своя зона ответстветнности и свое поведение
Evgeniy
у гео кординаты очевидно это координаты
Sergey
оценка расстояния между двумя координатами - задача самих координат
Evgeniy
ну и возможно название места
Sergey
точно так же как деньги могут сравнивать друг дружку
Sergey
короч, у тебя процедурныйы взгляд на вещи. Данные и процедуры
Evgeniy
ну ок, это дело вкуса
Evgeniy
но я бы делал не так
Sergey
это не дело вкуса. это принципиальна вещи
Sergey
инкапсуляция
Sergey
закон деметры
Evgeniy
новую кординату создай
Evgeniy
вот тебе и сдвиг
Sergey
кто его будет создавать?
Evgeniy
и используй ее
Sergey
это детали
Sergey
кто тебе будет сдвигать?
Sergey
а где она будет создаваться?
Sergey
то что иммутабельность и вся хуйня это и так понятно
Sergey
где эта логика должна быть?
Sergey
отдельные функции в неймспейсе? статические методы? отдельный сервис?
Evgeniy
а где ты ее двигаешь
Evgeniy
для чего ?
Evgeniy
на карте ?
Evgeniy
новая отметка ?
Sergey
class Point
{
public function moveRelativly(Point $point);
}
Sergey
какая разница?) алгоритм просчета дистанции не такой уж и простой
Sergey
чтобы его везде копипастить
Evgeniy
ну так вынеси его из объекта тем более
Evgeniy
пусть он отвечает за хранение кординат
Sergey
$theta = $lng1 - $lng2;
$dist = sin(deg2rad($lat1))
* sin(deg2rad($lat2))
+ cos(deg2rad($lat1))
* cos(deg2rad($lat2))
* cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
return round($dist * 60 * 1.1515);
Sergey
вот чтобы быть точнее
Sergey
куда вынести?
Evgeniy
ну я бы делал ServiceGeoCordinat
Sergey
короч ты только что сломал инкапсуляцию(
Evgeniy
и для определения дистанций метод distance(GeoCordinat $a, GeoCordinat $b);
Sergey
как этот метод получит данные находящиеся внутри $a и $b?
Sergey
гетеры?
Sergey
публичные свойства?
Evgeniy
да
Evgeniy
геттеры очень даже ничего
Sergey
поздравляю, ты только что нарушил закон деметры
Sergey
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%94%D0%B5%D0%BC%D0%B5%D1%82%D1%80%D1%8B
Sergey
Sergey
если у тебя есть геттеры, которые нужны ТОЛЬКО для одной фигни, значит эту фигню надо вносить в объект
Evgeniy
так там МОДУЛИ
Evgeniy
а тут классы
Evgeniy
эти классы в одном модуле
Sergey
вот елси у тебя 10 операций - то тогда значит данные лежат немного не там где надо)
Sergey
геттеры в целом свидетельствуют о низкой внутренней связанности системы (coheasion)
Sergey
полностью от них отказаться никак не выйдет, но лепить их просто так - это не ООП
Evgeniy
хорошо вот тебе вопрос
Evgeniy
твои кординаты должны взаимодействовать с дорой
Evgeniy
тот же 2 гис например
Evgeniy
и тебе надо просчитывать кратчайший маршрут
Evgeniy
на основе карт
Sergey
нет, мои координаты не должны с ними взаимодействовать