Задать вопрос
kumaxim
@kumaxim
Web-программист

На что это больше похоже: паттерн или говнокод?

Всем доброго времени суток.
В своем последнем проекте частенько натыкаюсь на следующую конструкцию:
class Reboot implements Process
{
	private static $_folder = __DIR__;
	
	private function __construct()
	{}

	public static function reboot()
	{
		$instance = new self;
		$instance->pause();
		$instance->stop();
		$instance->start();
	}

	private function pause()
	{
		//...
	}
}

Я в этом коде одного понять не могу: с какой целью его автор создает экземпляр объекта в статичном методе, причем запрещая создание объекта из вне(конструктор приватный)? Какой смысл в создании синонима к конструктору? Это какой-то неизвестный мне design pattern(буду благодарен ссылке) или же обычный говнокод?

Окружение: PHP 5.2 и CodeIgniter 2, если это имеет какое-то значение.

UPD: коллеги, я знаю как Singleton выглядит. Первой моей мыслью было что вот это как раз и есть его кастрированная версия, причем каким-то непонятным образом... Единственный перегруженный магичекий метод из PHP __construct. Весь значимый для вопроса код полный, содержание методов pause, stop и start большого значения не имеет. Кроме того что это раньше был Singleton есть у кого-нибудь еще какие-нибудь идеи?
  • Вопрос задан
  • 599 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Никакого отношения сингелтону этот код не имеет.

с какой целью его автор создает экземпляр объекта в статичном методе


У этого приема много названий. По сути это статический метод-фабрика, еще можно встретить "именованный конструктор".

class User {
    private function __construct($email, $password) { /* ... */}
    public static function create($email, $password) { 
         return new static($email, $password); 
    }
    public static function createWithProfile($email, $password, UserProfile $profile) {
         $user = static::create($email, $password);
         $user->profile = $profile;
         return $user;
    }
}

$user1 = User::create('example@example.com', 'example');
$user2 = User::createWithProfile('example@example.com', 'example', new UserProfile(
    $firstName, $lastName, $avatar /* ... */
));


Основная идея тут - сделать возможность задания последовательности действий, и при этом запретить пользовательскому коду эту последовательность как-то нарушить. Все для того что бы ограничить человека от возможных ошибок.

Отличие тут в том что мы не возвращаем экземпляр класса, он однаразовый. Только для этой последовательности.

Почему бы не сделать так, спросите вы:
(new Reboot())->reboot();

Потому что нам не нужен этот инстанс. Функция reboot ничего не должна вернуть, а объект который создается - одноразовый. Почему так - надо смотреть в контексте. При работе с процессами я могу придумать десяток кейсов когда это надо.

По сути можно было бы спокойно сделать это обычной функцией, но автор посчитал что так будет читабельнее. Говнокод часть тут только имя класса - Reboot. Имена классов, интерфейсов и т.д. должны быть существительными. Мы описываем тип объектов. Но это единственное место к которому я могу придраться.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
aminought
@aminought
Приватный конструктор, статичный метод, который создаёт новый экземпляр класса... Судя по всему, это какой-то модифицированный Singleton.
Ответ написан
@gro
Получается есть некая функция, которая что-то там делает.
И есть вспомогательный класс, который нужен только для реализации этой функции и нигде вовне.
Для простоты эта функция сделана, как статический метод данного класса.

Нопремер...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы