Как я могу улучшить этот код, чтобы отобразить контактные телефоны?


Я делаю адресной книги, как приложение .
У меня contactType перечисление.

public enum ContactType
{
  //just a cut down version
  MOBILE,PHONE,FAX,EMAIL;

}

Тогда у меня есть контакт класс

public class Contact
{
   private ContactType contactType;
   private String value;//e.g phone number or email
   private String areaCode;//does not apply to email or mobile
   //....getters and setters
}

Тогда у меня есть класс Person

public class Person
{
    private List<Contact>contacts;
    //----Other attributes and getters and setters

}

Я думал, что у меня очень хорошо прибито :) но, как оказывается, видимо, нет:( потому что

Теперь мне нужно, чтобы отобразить список людей(список лиц) и в таблице вместе с некоторыми другими вещами (имя и т. д.)У меня есть следующие столбцы:

Name|......|Phone|Mobile|Fax  |Email

Теперь я понял, что я не могу просто перебрать список людей и дисплей контактные телефоны, так как эти контакты находятся в списке внутри каждого объекта в списке людей.
Простыми словами, как вы, возможно, знаете сейчас уже если у меня есть список людей e.г

List<Person>people ;

Тогда это не является допустимым вариантом

for(Person person: people)
{
  //can not get phone number for example by going
  person.getPhone();
}

но это

for(Person person: people)
    {
      //but will have to get it from the list of contacts e.g
      List<Contact>contacts = person.getContacts();
      for(Contact contact:Contacts)
      {
         if (contact.getContactType.isPhone())
         {
            contact.getValue();
         }
      }
    }

Так что у меня теперь введен класс Rowitem

  public class Rowitem {

        private String phone;
        private String fax;
        private String mobile;
        private String email;

        ....

     }

и заполнения, как это

private void populateForDisplay(Rowitem item,List<Contact> contacts) 
 {
        for (Contact contact : contacts) 
        {
            if (contact.getType().isEmail()) {
                item.setEmail(contact.getValue());
            }
            if (contact.getType().isFax()) {
                item.setFax(contact.getValue());
            }
            if (contact.getType().isMobile()) {
                item.setMobile(contact.getValue());
            }
            if (contact.getType().isPhone()) {
                item.setPhone(contact.getValue());
            }
        }

    }

Хотя этот подход работает, я просто не думаю, что это правильно. Во-первых, мне не нравится то, что я должен ввести этот класс RowItem и тогда все эти заявления, если не смотреть прямо. Как я могу улучшить это?
Передний конец рамки, которые я использую JSF2, но, вероятно, не уместен.

Мне нужен кто-то, чтобы пересмотреть мой подход, а не строка за строку кода.
Я читал https://codereview.stackexchange.com/faq и я думаю, что мой вопрос с правилами, если нет, то пожалуйста, руководство мне, и я буду двигаться в этом.
Ведь не проблема в коде, я не думаю, что пойдут на сайте StackOverflow



263
2
задан 14 сентября 2011 в 09:09 Источник Поделиться
Комментарии
2 ответа

Сначала я хотел бы предложить, чтобы избавиться от контакта тип перечисления и вместо извлечения контактов из вашего контакт класса. Это позволит значительно увеличить сплоченность, таким образом, вы не должны иметь такие поля, как код в свою базу контактов класс.

Что касается вашей проблемы: вы могли бы использовать что-то вроде посетителя шаблон для навигации по "дереву" данных (Человек -> Человек -> контакты) с человека и связаться действуя в качестве элементов принимают абстрактного посетителя. Это даст вам гибкость, чтобы пройти по дереву для различных целей. Для вашего сценария, вы могли бы написать что-то вроде TableVisitor, что создает структуру таблиц, которые вы хотите создать.

3
ответ дан 14 сентября 2011 в 10:09 Источник Поделиться

Если ваша структура данных для хранения контактов ценности-это просто строки, этот код должен помочь :-

public class Person {

private Map<ContactType, String> contactMap;

public Person() {
contactMap = new HashMap<ContactType, String>();
}

public void addContact(ContactType type, String value) {
contactMap.put(type, value);
}

public String getContact(ContactType type) {
return contactMap.get(type);
}
}

Добавление нового ContactType не изменить приведенный выше код. Просто добавить новый тип в enum ContactType.

Переборе часть стала чище. Вы можете легко перебирать человекус контакта с помощью перечисления в качестве ключа.

ContactType[] contactTypes=ContactType.values();
for (Person p : personList) {
// get other Person fields.
for(ContactType t:contactTypes){
p.getContact(t);
}
}

2
ответ дан 14 сентября 2011 в 05:09 Источник Поделиться