Progettazione dell'API con impostazioni standard e personalizzate

5

Supponiamo che una classe permetta un qualche tipo di configurazione che ha alcuni valori predefiniti ben noti, ma ha anche la possibilità di definire un valore personalizzato. Ad esempio, supponi di voler consentire agli utenti di configurare il titolo di una persona. Possono scegliere tra una serie di valori standard (Mr., Mrs., Ms., ecc.) Ma possono anche specificare un'abitudine (Dr.). Qual è il modo più elegante per inserire questo in un'API? Alcuni esempi in Java:

public class Person {
  public enum Title {MR, MRS, MS, CUSTOM};

  setTitle(Title title, String customTitle);
}

Questo è piuttosto negativo perché ogni volta che si specifica qualcosa di diverso da Title.CUSTOM, il secondo argomento viene ignorato silenziosamente.

Quindi forse:

public class Person {
  public enum Title { MR, MRS, MS, CUSTOM};

  setTitle(Title title);
  setCustomTitle(String title);
}

Anche in questo caso non mi piace molto, perché non è immediatamente chiaro che chiamarne uno sovrascriverà gli effetti dell'altro metodo. C'è un'interfaccia più elegante che sto trascurando?

    
posta Deckard 06.02.2012 - 11:50
fonte

2 risposte

5

Potresti sovraccaricare setTitle mthod

public class Person{
    public enum Title { MR, MRS, MS, CUSTOM };
    private Title EnumTitle
    private String CustomTitle;

    public void setTitle(Title title); //Does what you'd expect
    public void setTitle(String title)
    {
        EnumTitle = Title.CUSTOM;
        CustomTitle = title;
    }

    /**
     * This does present some problems when returning the value, however.
     *
     * My first thought to solve this problem is to always expect the 
     * output of getTitle() to be a string - either the custom title or
     * a string representation of the enum value.
     */ 
}
    
risposta data 06.02.2012 - 11:59
fonte
1

C'è una ragione per cui hai bisogno dell'enumerazione del titolo o è solo un dettaglio di implementazione?

A seconda di ciò che vuoi fare con l'api, questa potrebbe essere una soluzione semplice.

public class Person {
  public static final String MR = "MR";
  public static final String MRS = "MRS";
  public static final String MS= "MS";

  public void setCustomTitle(String title);
}

Forse è una buona idea distinguere il titolo dal sesso se è necessario per l'elaborazione

  public enum Sex { Female, Male, };
  public void setSex(Sex sex); //Does what you'd expect
    
risposta data 06.02.2012 - 12:46
fonte

Leggi altre domande sui tag