Я нахожусь в ситуации, когда я хочу использовать интерфейсы, но я сам догадываюсь.
Я пишу приложение для обработки страховых заявок. Существует объект Application, в котором хранятся все данные о приложении страхования. Сюда входят данные о застрахованном лице, субъекте, которому будет принадлежать страховой полис, и субъекте, который оплатит страховое покрытие.
Я использую термин сущность, потому что полис может принадлежать (или оплачиваться) Лицом или Трастом. Я знаю, когда имею дело с владельцем или плательщиком, но я не обязательно знаю, является ли этот владелец или плательщик лицом или трастом. Первоначально я создал интерфейс Owner для сокращения приведения и логики на основе instanceof. Я планировал сшить на интерфейсе Payor, но теперь сам догадываюсь.
Это, наверное, все, что вам нужно знать на данный момент. Вот некоторый код:
public class Application{
private Person insured;
private Owner owner;
private Payor payor;
...
}
public interface Owner{
public void setAddress(Address address);
public Address getAddress();
public void setId(String id);
public String getId();
public void setPIN(String pin);
public String getPIN();
}
public interface Payor{
public void setAccount(Account account);
public Account getAccount();
}
public class Person implements Owner, Payor{
...
}
public class Trust implements Owner, Payor{
...
}
Я на правильном пути или я должен делать это по-другому? То, что заставляет меня задуматься, это то, что не каждый человек будет владельцем или плательщиком.
По мере того, как я думаю об этом больше, я чувствую, что Владелец и Пайор не столько "поведение", сколько "классификация". Это делает мое использование интерфейсов здесь неправильным? Если да, есть ли у вас какие-либо рекомендации для альтернативных решений? Желательно, чтобы те, которые позволяют мне продолжать прозрачно использовать Персоны и Трасты в качестве Владельцев и Плательщиков?
Часть моей озабоченности связана с тем, что менее знакомые разработчики путают человека с владельцем, как показано ниже.
Application app = new Application();
Person timmy = new Person();
Owner smithFamilyTrust = new Trust();
Payor steve = new Person();
app.setInsured(timmy);
app.setOwner(smithFamilyTrust);
app.setPayor(steve);
...
//this would run, but would be wrong
if(timmy instanceof Owner){
//Do Owner Stuff.
}
//this would run, and be correct
Owner owner = app.getOwner();
//Do Owner Stuff
Редактировать, чтобы уточнить "Owner Stuff"
На данный момент «вещи владельца» просты. Такие вещи, как получение / установка идентификатора владельца, PIN-кода или адреса:
//I want this
app.getOwner().getId();
app.getOwner().getPIN();
app.getOwner().getAddress();
//I don't want this
if(app.getOwner() instanceof Person){
Person owner = app.getOwner();
owner.getId();
owner.getPIN();
owner.getAddress();
} else if(app.getOwner() instanceof Trust){
Trust owner = app.getOwner();
owner.getId();
owner.getPIN();
owner.getAddress();
}
Изначально я подумал, что должен пойти с каким-то суперклассом Entity, чтобы Person и Trust расширили этот класс, но они по-разному хранят и получают идентификаторы и PIN-коды. Различная реализация одного и того же поведения привела меня к интерфейсам.
Я все еще мог бы пойти с суперклассом Entity, но я чувствую, что не могу точно представить «универсальный» идентификатор или ПИН-код для этого класса Entity. Мне нужно будет реализовать логику идентификатора и PIN-кода Person или логику ID и PIN-кода Trust, а затем переопределить ее в другом классе. Это неправильно для меня. Я полагаю, что Entity может быть абстрактным классом, который расширяют Person и Trust, но я не уверен, что это лучше, чем использование интерфейса.