@oop_ru

Страница 23 из 785
Evgeniy
09.12.2016
11:18:58
и по возможностям не уступает, только я доку не запилил

Sergey
09.12.2016
11:19:35
<?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
09.12.2016
11:20:04
еще код в GeoCoords есть ?

Aleh
09.12.2016
11:20:21
isEqual какой-нибудь и мб distanceFrom

Google
Aleh
09.12.2016
11:20:29
от домена зависит)

Evgeniy
09.12.2016
11:21:21
здесь только один именнованный конструктор

Aleh
09.12.2016
11:21:48
иии?

Evgeniy
09.12.2016
11:22:33
http://pastebin.com/ngxBxRQy

чем этот код хуже?

18 строка там не нужна

вот более корректный вариант (в первый раз я просто скопипастил) http://pastebin.com/tvyD0PvR

Sergey
09.12.2016
11:26:03
еще код в GeoCoords есть ?
нет, это тебе конкретный пример когда конструктор пустой, а именованный конструктор это не просто преобразователь данных для того чтобы конструктору подходили

при этом не нарушая инкапусляцию

Evgeniy
09.12.2016
11:27:16
опять же мое имхо, я стараюсь по возможности делать immutable

Sergey
09.12.2016
11:27:30
блять

при чем тут immutable?)

Evgeniy
09.12.2016
11:27:45
при том что после создания чтобы нельзя было поменять

Google
Evgeniy
09.12.2016
11:27:59
по возможности

это мое имхо я не отрицаю что именнованные конструкторы могут пригодится

и могут использоваться

просто по возможности не стоит давать доступ к ним из вне

если они нужны тебе и твоему коду то юзаешь

но если ты делаешь GeoCordinatInterface то их сюда лучше не засовывать

без необходимости

если необходимо добавляй и старайся поддерживать их где возможно

ну и соответсвенно обратный по опыт, по возможности я стараюсь не пользоваться такими методами если их явно не рекомендует сам автор

потому что если их переделают больно будет твоему коду

но это тоже имхо

например если автор говорит юзай их я буду юзать

например вот http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/configuration.html

но если это внутри кода библиотека и не документированна или внутри кода чужого класса, я подумаю, а смогу ли я подобное сделать через те инструменты что рекомендует автор (в доке или interface) если да то предпочту их наверно

или может я как то не так думаю?

Sergey
09.12.2016
11:41:01
<?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
09.12.2016
11:43:17
это мое имхо я не отрицаю что именнованные конструкторы могут пригодится
конструкторы.... в интерфейсах? Ну или "статические методы в интерфейсах"? Серьезно?

здесь только один именнованный конструктор
какая разница? Именованные конструкторы делают код выразительнее

$this->remember(UserRegisteredEvent::appear());

Google
Sergey
09.12.2016
11:44:36
вместо

$this->remember(new UserRegisteredEvent());

прикольнее пожалуй так

$this->rememberThat(UserRegisteredEvent::appear($this));

Sergey
09.12.2016
11:45:49
$time = Time::fromValues($hours, $minutes); $time = Time::fromString($time); $time = Time::fromMinutesSinceMidnight($minutesSinceMidnight);

Sergey
09.12.2016
11:46:16
Time:toDie()

вместо new Time(Time::TIME_TO_DIE)

Aleh
09.12.2016
11:46:44
User::register

вместо new User

Sergey
09.12.2016
11:46:54
User::createAccount()

Aleh
09.12.2016
11:46:54
попроще пример)

ну зависит

от того че как

Sergey
09.12.2016
11:47:21
Order::createWithUser($user)

Sergey
09.12.2016
11:47:23
Category::new()

)))

Aleh
09.12.2016
11:47:32
new?)

Sergey
09.12.2016
11:47:40
ну а че нет?)

Aleh
09.12.2016
11:47:48
new Category

писать меньше)

Google
Aleh
09.12.2016
11:47:57
а понятность такая же)

Sergey
09.12.2016
11:48:07
Category()

Sergey
09.12.2016
11:48:10
ну да) я просто думал набросить

Aleh
09.12.2016
11:48:39
нельзя ж инвокабл класс запилить?

Sergey
09.12.2016
11:48:46
неа..

?

это должен быть статически инвокабл

Sergey
09.12.2016
11:49:19
нужно больше статики статическому богу

веруешь ты в статического бога или в бога динамического?

Aleh
09.12.2016
11:49:38
нужны мета классы

и тогда можно на статику делать интерфейсы

бугага

Sergey
09.12.2016
11:50:02
хз... функции... модули...

и хватит?

хотя без объектов начнут монадами обмазываться

Sergey
09.12.2016
11:50:41
манки патчинг нужен

без него никак

Aleh
09.12.2016
11:51:00
хы

Google
Evgeniy
09.12.2016
13:06:55
и не создать координаты через конструктор ?

тоже самое и с createFromAddress

Sergey
09.12.2016
13:07:27
а если таких мест 2..3..10?

Evgeniy
09.12.2016
13:07:35
это попытка в классе предугадать в классе, как его будут использовать

из за метода createFromAddress у тебя лишняя зависимость от AddressInterface

которой можно было бы вполне избежать

в текущем коде, я понимаю что в реальности завимость от AddressInterface возможно есть или ее использование

но именно в примере это лишняя зависимость

Sergey
09.12.2016
13:09:12
это попытка в классе предугадать в классе, как его будут использовать
вообще то ты всегда должен "предугадывать" или хотя бы "закладывать" способ использования твоих штукенций пряча нюансы

откуда у тебя интерфейс взялся

Evgeniy
09.12.2016
13:09:39
геокордината это обычный объект же

который хранит координаты

Sergey
09.12.2016
13:10:01
любой! публичный метод или свойство составляют интерфейс объекта

и интерфейс должен быть удобным и простым

Evgeniy
09.12.2016
13:10:10
определение дистанции между 2 координатами надо стараться сделать в отдельном объекте

Sergey
09.12.2016
13:10:12
явно описывая что и зачем

а не как

Evgeniy
09.12.2016
13:10:36
ну в примере у тебя у координат определение дистанции

Sergey
09.12.2016
13:10:56
ну в примере у тебя у координат определение дистанции
есть такая штука - информационный эксперт. Данные должны обрабатываться там где они есть.

Страница 23 из 785