Evgeniy
здесь только один именнованный конструктор
Ale
иии?
Evgeniy
http://pastebin.com/ngxBxRQy
Evgeniy
чем этот код хуже?
Evgeniy
18 строка там не нужна
Evgeniy
вот более корректный вариант (в первый раз я просто скопипастил) http://pastebin.com/tvyD0PvR
Sergey
еще код в GeoCoords есть ?
нет, это тебе конкретный пример когда конструктор пустой, а именованный конструктор это не просто преобразователь данных для того чтобы конструктору подходили
Sergey
при этом не нарушая инкапусляцию
Evgeniy
опять же мое имхо, я стараюсь по возможности делать immutable
Sergey
блять
Sergey
при чем тут immutable?)
Evgeniy
при том что после создания чтобы нельзя было поменять
Evgeniy
по возможности
Evgeniy
это мое имхо я не отрицаю что именнованные конструкторы могут пригодится
Evgeniy
и могут использоваться
Evgeniy
просто по возможности не стоит давать доступ к ним из вне
Evgeniy
если они нужны тебе и твоему коду то юзаешь
Evgeniy
но если ты делаешь GeoCordinatInterface то их сюда лучше не засовывать
Evgeniy
без необходимости
Evgeniy
если необходимо добавляй и старайся поддерживать их где возможно
Evgeniy
ну и соответсвенно обратный по опыт, по возможности я стараюсь не пользоваться такими методами если их явно не рекомендует сам автор
Evgeniy
потому что если их переделают больно будет твоему коду
Evgeniy
но это тоже имхо
Evgeniy
например если автор говорит юзай их я буду юзать
Evgeniy
например вот http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/configuration.html
Evgeniy
но если это внутри кода библиотека и не документированна или внутри кода чужого класса, я подумаю, а смогу ли я подобное сделать через те инструменты что рекомендует автор (в доке или interface) если да то предпочту их наверно
Evgeniy
или может я как то не так думаю?
Sergey
<?php
final class GeoCoords
{
/**
* @var float
*/
private $latitude;
/**
* @var float
*/
private $longitude;
/**
* GeoCoords constructor.
* @param $latitude
* @param $longitude
*/
public function __construct($latitude, $longitude)
{
$this->latitude = $latitude;
$this->longitude = $longitude;
}
/**
* @param string $text
* @return GeoCoords
*/
public static function createFromString(string $text): GeoCoords
{
$arr = explode(":", $text);
return new static($arr[0], $arr[1]);
}
/**
* @param AddressInterface $address
* @return GeoCoords
*/
public static function createFromAddress(AddressInterface $address): GeoCoords
{
return new static($address->getLat(), $address->getLon());
}
/**
* @param GeoCoords $geoCoords
* @return float
*/
public function distanceTo(GeoCoords $geoCoords)
{
//impl
}
/**
* @return string
*/
public function __toString()
{
return join(":", [$this->latitude, $this->longitude]);
}
}
Sergey
вот более реальный пример
Sergey
Sergey
$this->remember(UserRegisteredEvent::appear());
Sergey
вместо
Sergey
$this->remember(new UserRegisteredEvent());
Sergey
прикольнее пожалуй так
Sergey
$this->rememberThat(UserRegisteredEvent::appear($this));
Sergey
$time = Time::fromValues($hours, $minutes);
$time = Time::fromString($time);
$time = Time::fromMinutesSinceMidnight($minutesSinceMidnight);
Sergey
Time:toDie()
Sergey
вместо new Time(Time::TIME_TO_DIE)
Ale
User::register
Ale
вместо new User
Sergey
User::createAccount()
Ale
попроще пример)
Ale
ну зависит
Ale
от того че как
Sergey
Order::createWithUser($user)
Sergey
Category::new()
Sergey
)))
Ale
new?)
Sergey
ну а че нет?)
Ale
new Category
Ale
писать меньше)
Ale
а понятность такая же)
Sergey
Category()
Sergey
ну да) я просто думал набросить
Ale
нельзя ж инвокабл класс запилить?
Sergey
неа..
Sergey
😔
Sergey
это должен быть статически инвокабл
Sergey
нужно больше статики статическому богу
Sergey
веруешь ты в статического бога или в бога динамического?
Ale
нужны мета классы
Ale
и тогда можно на статику делать интерфейсы
Ale
бугага
Sergey
хз... функции... модули...
Sergey
и хватит?
Sergey
хотя без объектов начнут монадами обмазываться
Sergey
манки патчинг нужен
Sergey
без него никак
Ale
хы
Evgeniy
Evgeniy
почему в месте где понадобились координаты не сделать преобразования к получению координат
Evgeniy
и не создать координаты через конструктор ?
Evgeniy
тоже самое и с createFromAddress
Sergey
а если таких мест 2..3..10?
Evgeniy
это попытка в классе предугадать в классе, как его будут использовать
Evgeniy
из за метода createFromAddress у тебя лишняя зависимость от AddressInterface
Evgeniy
которой можно было бы вполне избежать
Evgeniy
в текущем коде, я понимаю что в реальности завимость от AddressInterface возможно есть или ее использование