Perché i Costruttori nominati stanno diventando popolari non dovrebbe essere un antipattern?

1

Secondo il seguente articolo Costruttori nominati L'autore suggerisce di usare static factory pattern per costruire oggetti è molto meglio dell'istantaneo con la parola chiave new . All'inizio l'idea è allettante (secondo alcuni dettagli nell'articolo) sì, i nomi dei metodi sono più ovvi e dà la sensazione che la costruzione della classe non dipende dal suo coordina ma la classe ha comportamenti diversi a seconda dei diversi problemi di costruzione livello.

<?php
$customer = new Customer($name); 
// We can't "new a customer" or "instantiate a customer" in real life.
// Better:
$customer = Customer::fromRegistration($name);
$customer = Customer::fromImport($name);

Ma il problema che vedo qui secondo questo idioma stiamo usando la classe methods come functions ! E secondo l'esempio precedente crea problemi di accoppiamento, dobbiamo avvolgere questo static factories con una fabbrica di iniettori per disaccoppiare dal resto dell'applicazione?

Potresti per favore chiarirmi per capirlo. Ho iniziato a vedere questo idioma tutt'intorno nella comunità PHP e persino in alcuni esempi Java.

    
posta FZE 03.10.2017 - 10:53
fonte

2 risposte

7

Named Constructors in PHP

Don't limit yourself by PHP's single constructor. Use static factory methods.

L'articolo non riguarda l'accoppiamento. C'è zero differenze nell'accoppiamento tra l'utilizzo di new Customer(/* some args */) e Customer::fromFoo(/* some args */) . Dove metti quelle espressioni determina quanto sono accoppiate. Tutto il "modello di fabbrica" si riduce a "oggetto che restituisce un'espressione".

La differenza consiste invece nel lavorare intorno alla restrizione di PHP su una classe che ha un singolo costruttore. Se vuoi avere più modi di costruire una classe, ci sono due scelte:

  • distinguerli nel singolo costruttore, dagli argomenti
  • distinguerli con più fabbriche statiche, che accettano argomenti diversi tra loro.
risposta data 03.10.2017 - 11:38
fonte
0

In PHP non abbiamo più costruttori per classe, ma ciò non aiuterà comunque perché verrebbero identificati con lo stesso nome: __construct , un termine che non deriva dal linguaggio ubiquitario.

Ma perché usiamo comunque un costruttore? Lo usiamo per avviare correttamente un oggetto in uno stato iniziale valido. Possiamo farlo rendendo private le proprietà, il che aiuta anche a proteggere l'incapsulamento dell'oggetto. Ciò significa che possono essere modificati solo dal contesto della classe . Il problema è che potrebbe esserci più di uno stato iniziale valido per molti dei nostri oggetti. Quindi, per consentire solo gli stati validi iniziali e per proteggere l'incapsulamento, possiamo usare i metodi statici di classe come costruttori di oggetti, uno per ogni caso d'uso.

In C ++ ci sono classi di amici che possono accedere a proprietà private e quindi loro può avere una classe di amici come fabbrica per ogni caso d'uso, ma noi non è così che dobbiamo usare metodi statici.

BTW, l'uso di metodi statici non interrompe l'incapsulamento perché il contesto è di classe. Lo puoi vedere dal fatto che PHP ti consente di accedere a private di proprietà e metodi anche da metodi di classi statiche.

    
risposta data 04.10.2017 - 05:11
fonte