Evgeniy
но именно в примере это лишняя зависимость
Sergey
это попытка в классе предугадать в классе, как его будут использовать
вообще то ты всегда должен "предугадывать" или хотя бы "закладывать" способ использования твоих штукенций пряча нюансы
Sergey
откуда у тебя интерфейс взялся
Evgeniy
геокордината это обычный объект же
Evgeniy
который хранит координаты
Sergey
любой! публичный метод или свойство составляют интерфейс объекта
Sergey
и интерфейс должен быть удобным и простым
Evgeniy
определение дистанции между 2 координатами надо стараться сделать в отдельном объекте
Sergey
явно описывая что и зачем
Sergey
а не как
Evgeniy
ну в примере у тебя у координат определение дистанции
Sergey
ну в примере у тебя у координат определение дистанции
есть такая штука - информационный эксперт. Данные должны обрабатываться там где они есть.
Evgeniy
зачем в простом объекте по хранению координат держать логику
Sergey
потому что в этом суть ООП
Sergey
данные и логика по обработке этих данных должны лежать вместе
Sergey
инкапсуляция и все такое
Evgeniy
у тебя там только один объект GeoCordinat ?
Evgeniy
больше никаких объектов ?)
Evgeniy
делаем GodObject ?
Sergey
у каждого объекта своя зона ответстветнности и свое поведение
Evgeniy
у гео кординаты очевидно это координаты
Sergey
оценка расстояния между двумя координатами - задача самих координат
Evgeniy
ну и возможно название места
Sergey
точно так же как деньги могут сравнивать друг дружку
Sergey
короч, у тебя процедурныйы взгляд на вещи. Данные и процедуры
Evgeniy
ну ок, это дело вкуса
Evgeniy
но я бы делал не так
Sergey
это не дело вкуса. это принципиальна вещи
Sergey
инкапсуляция
Sergey
закон деметры
Sergey
зачем в простом объекте по хранению координат держать логику
где должна быть логика например по "сдвинуть координату влево на 10 пунктов" или "дистанция до координаты Б" или же "координата, между текущей точкой и точкой Б" ?
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
ну так вынеси его из объекта тем более
1. Куда? В PointDistanceCalculator? 2. Теперь придется открыть доступ к внутреннему состоянию Point
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
если у тебя есть геттеры, которые нужны ТОЛЬКО для одной фигни, значит эту фигню надо вносить в объект
Evgeniy
так там МОДУЛИ
Evgeniy
а тут классы
Evgeniy
эти классы в одном модуле
Sergey
вот елси у тебя 10 операций - то тогда значит данные лежат немного не там где надо)
Sergey
геттеры в целом свидетельствуют о низкой внутренней связанности системы (coheasion)
Sergey
полностью от них отказаться никак не выйдет, но лепить их просто так - это не ООП
Evgeniy
хорошо вот тебе вопрос
Evgeniy
твои кординаты должны взаимодействовать с дорой
Evgeniy
тот же 2 гис например
Evgeniy
и тебе надо просчитывать кратчайший маршрут
Evgeniy
на основе карт
Sergey
нет, мои координаты не должны с ними взаимодействовать