Chiarimento su un esempio del principio polimorfico aperto / chiuso

3

La mia domanda riguarda il principio polimorfico Open-Closed.

Dire che ho il seguente client:

public class Client {

    private Server server;

    public Client(Server server) {
        this.server = server;
    }

    public void purchase() {
        server.processPurchase(new Purchase());
    }
}

Questa è l'astrazione per il server:

public interface Server {

    void processPurchase(Purchase purchase);
}

E l'implementazione per il server:

public class ServerImpl implements Server {

    @Override
    public void processPurchase(Purchase purchase) {
        System.out.println("Processing purchase" + purchase);
        processPayment(purchase);
    }

    private void processPayment(Purchase purchase) {
        System.out.println("Processing payment" + purchase);
    }
}

Questo caso di utilizzo minimalista riguarda l'esecuzione di un acquisto.

Ora dì che uno vuole eseguire un'altra azione quando elaboro l'acquisto, ad esempio:

  • aggiungi le informazioni di acquisto a un database per essere successivamente utilizzate per suggerimenti di apprendimento automatico
  • invia un'email di conferma all'utente
  • ecc.

Quale sarebbe il modo migliore per ottenere il cambiamento pur rispettando l'OCP?

La mia prima idea è scrivere una seconda implementazione e scambiarla dalla prima come segue:

public class ServerImpl2 implements Server {

    @Override
    public void processPurchase(Purchase purchase) {
        System.out.println("Processing purchase" + purchase);
        processPayment(purchase);
        sendConfirmationEmail(purchase);
    }

    private void processPayment(Purchase purchase) {
        System.out.println("Processing payment" + purchase);
    }

    private void sendConfirmationEmail(Purchase purchase) {
        System.out.println("Sending confirmation email");
    }
}

C'è un altro modo? Qualsiasi input o suggerimento benvenuto.

    
posta balteo 03.10.2018 - 10:51
fonte

2 risposte

5

Il principio Polymorphic Open-closed afferma che dovresti sovrascrivere i metodi derivanti da interfacce e implementazione non .

Aggiungendo le chiamate di metodi private all'interno della tua implementazione, non stai violando questo in minima parte. Questo è solo il presupposto che dovresti mai derivare da ServerImpl , avresti solo bisogno di sovrascrivere il metodo processPurchase e non, ad esempio, sendConfirmationEmail per esempio poiché questo è un metodo specifico per l'implementazione.

È assolutamente bene disporre di metodi privati per aiutare a realizzare il metodo pubblico riscattabile processPurchase .

    
risposta data 03.10.2018 - 11:09
fonte
0

Il principio di open closed può essere realizzato attraverso l'uso di interfacce. Usando le interfacce, hai un grande controllo sull'estensione delle tue lezioni, mentre ti impedisci di modificare le abilità dei genitori, ecc.

Al momento sono mobile, ma di seguito è riportato un esempio.

Supponiamo di avere il seguente:

interface IEat
{
     void Eat(Food food);
}

abstract class Animal {} : IEat
{
    abstract void Eat() { ... }
}

Ora vogliamo creare un sottotipo di predatore che estenda la funzionalità dell'animale, ma, soprattutto, non modifica il comportamento ...

Possiamo raggiungere questo obiettivo utilizzando un'altra interfaccia (in particolare NOT attraverso la sovrascrittura delle funzioni Animali).

interface Predator
{
    void HuntForFood()
}

class Predator : IEat, IPredator
{
    void Eat(Food food)
     {
          this.HuntForFood();
          // Carry on eating.
     }

     void HuntForFood()
     {
           ...
     }
}
    
risposta data 04.10.2018 - 13:39
fonte

Leggi altre domande sui tag