design da API envolvendo configurações padrão e personalizadas

5

Suponha que uma classe permita algum tipo de configuração que tenha alguns valores padrão conhecidos, mas também tenha a opção de definir um valor personalizado. Por exemplo, suponha que você queira permitir que os usuários configurem o título de uma pessoa. Eles podem escolher entre um conjunto de valores padrão (Mr., Mrs., Ms., etc.), mas eles também podem especificar um costume (Dr.). Qual é a maneira mais elegante de colocar isso em uma API? Alguns exemplos em Java:

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

  setTitle(Title title, String customTitle);
}

Este é muito ruim porque sempre que você especifica algo além de Title.CUSTOM, o segundo argumento é silenciosamente ignorado.

Então, talvez:

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

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

Eu também não gosto muito deste, porque não está claro de imediato que chamar um irá sobrescrever os efeitos do outro método. Existe uma interface mais elegante que eu estou negligenciando?

    
por Deckard 06.02.2012 / 11:50
fonte

2 respostas

5

Você pode sobrecarregar o 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.
     */ 
}
    
por 06.02.2012 / 11:59
fonte
1

Existe uma razão pela qual você precisa da enumeração de título ou isso é apenas um detalhe de implementação?

Dependendo do que você deseja fazer com a API, essa pode ser uma solução simples.

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);
}

Talvez seja uma boa ideia distinguir o título do sexo, se isso for necessário para o processamento

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

Tags