Evgeniy
чем меньше публичных методов тем меньше тебе поддерживать
Ale
https://www.youtube.com/watch?v=9NANcPTbDBQ
Evgeniy
чем меньше поддерживать тем меньше кода
Evgeniy
речь не о конструторе
Sergey
именованные конструкторы - один из вариантов использования статических функций
Evgeniy
например
Sergey
функции без зависимостей, чистые - тоже плохо?
Evgeniy
публичный конструктор
Evgeniy
без аргументов
Evgeniy
через некоторое время понадобилось логировать
Evgeniy
ты пишешь (LoggerInterface $logger)
Evgeniy
и теперь все места где объект создавался надо передавать logger
Evgeniy
гораздо лучше чтобы LoggerInterface $logger = new NullLogger())
Evgeniy
было бы
Evgeniy
и там где надо логировать уже передавать нужное
Ale
Evgeniy
я к тому что надо стараться максимально поддерживать свой код
Sergey
ммм.. это щас к чему?
Evgeniy
а если ты каждую неделю меняешь код
Sergey
логировать именованные конструкторы или как?
Evgeniy
от которого зависят другие люди
Evgeniy
то как то не приятно
Evgeniy
именнованные конструкторы это по сути теже фабрики
Evgeniy
только они на основе разных вещей создают экземпляр
Evgeniy
а речь шла о изменение публичных вещей, например тех же статичных методов, я говорю что не надо лишнего публичного делать, если в этом нет необходимости
Evgeniy
в особенности в интерфейс
Sergey
в интерфейс пихать статичекие сигнатуры?
Sergey
это еще зачем?
Evgeniy
getInstance для singleton местами вписывают
Sergey
фабричные методы не люблю из за статических методов, которые доступны где угодно
Sergey
мы за синглтоны сейчас не говорим
Sergey
речь идет конкретно о фабричных методах, а конкретно именованных конструкторах
Evgeniy
хорошо давай детально
Sergey
что мешает тебе сделать
new Date в любом месте?
Sergey
точно так же и Date::createFromTime(..)
Sergey
что в этом конкретно плохого для тебя?
Evgeniy
я стараюсь те элементы что могут быть использованны в пакете
Sergey
в пхп нет пакетов
Evgeniy
другими участниками команды по возможности выносить в интерфейс
Evgeniy
namespace
Sergey
у тебя все сущности и DTO тоже с интерфейсами?
Evgeniy
если раз уже речь о пхп
Sergey
ограничений на неймспейсы нет как package-private в джаве
Sergey
так что они не в счет
Evgeniy
я сейчас говорю о той ситуации
Evgeniy
когда люди создают кучу публичных штук и не скрывают это интерфейсом
Evgeniy
я не против именнованных конструторов
Sergey
зачем тебе скрывать под интерфейсом статику?
Ale
и причем здесь статические методы(конструкторы)
Evgeniy
но когда они не уходят за пределы твоего namespace
Evgeniy
или если это явно не необходимая вещь
Evgeniy
чтобы юзать за пределами по поводу dto нет конечно не везде интерфесы
Evgeniy
я не только про скрывать под интерфейсом статику имею ввиду
Sergey
мы вроде о статике говорили
Sergey
тебя понесло в интерфейсы и связанность
Evgeniy
я говорю следующее что лучше прежде чем написать public стоит хорошо подумать
Evgeniy
и если есть возможность писать private
Sergey
ок... приватный именованный конструтор?)
Sergey
и где ты его использовать будешь?
Evgeniy
возвращаясь к конструкторам
Evgeniy
приватный именнованный конструктор это глупо
Evgeniy
так как он бесполезен
Evgeniy
я хочу сказать что в большинстве случаев достаточно одного конструтора!
Evgeniy
потому что остальные варианты как будут создавать экземпляр этого класса
Evgeniy
это не его проблема
Evgeniy
его ответсвенность делать что полезное
Evgeniy
и желательно только одно
Evgeniy
а кому и как создавать этот класс это их проблема
Evgeniy
потому что именнованные конструкторы они просто преобразуют данные передали им в формат понятный конструктору
Sergey
Evgeniy
давай пример
Evgeniy
я предпочитаю использовать ContainerInterface
Evgeniy
и он обычно есть только в App а уже объект создается на основе того что запросил в конструкторе
Evgeniy
я свою либу сделал но она очень похожа на http://php-di.org/
Evgeniy
и по возможностям не уступает, только я доку не запилил
Sergey
<?php
class GeoCoords
{
/**
* @var float
*/
private $latitude;
/**
* @var float
*/
private $longitude;
/**
* GeoCoords constructor.
*/
public function __construct()
{
}
public static function createFromCoordinates($latitude, $longitude)
{
$geoCoords = new static();
$geoCoords->latitude = $latitude;
$geoCoords->longitude = $longitude;
return $geoCoords;
}
}
Evgeniy
еще код в GeoCoords есть ?
Ale
isEqual какой-нибудь и мб distanceFrom
Ale
от домена зависит)