Связь has-a и надлежащая практика

#java #relationship #composition #aggregation

#java #отношения #композиция #агрегация

Вопрос:

Недавно я выполняю упражнения по кодированию, которые мне нужны для создания моего проекта, и пока я практикуюсь в этом с кодом ниже, я хочу спросить, имеет ли это отношение? правильно ли я поступаю? посмотрите на мой код, извините за мой плохой английский

 public class Personal {

        private String firstName;
        private String middleInitial;
        private String lastName;
        private int age;

        public Personal(String firstName,String middleInitial , String lastName , int age){
            setFirstName(firstName);
            setMiddleInitial(middleInitial);
            setLastName(lastName);
            setAge(age);
        }

        public void setFirstName(String firstName){
            this.firstName = firstName;
        }

        public String getFirstName(){
            return firstName;
        }

        public void setMiddleInitial(String middleInitial){
            this.middleInitial = middleInitial;
        }

        public String getMiddleInitial(){
            return middleInitial;
        }

        public void setLastName(String lastName){
            this.lastName = lastName;
        }

        public String getLastName(){
            return lastName;
        }

        public void setAge(int age){
            this.age = age;
        }

        public int getAge(){
            return age;
        }

        public String toString(){
            return String.format("First Name: " getFirstName() "nMiddle Initial: " getMiddleInitial() 
                                    "nLast Name: " getLastName() "nAge: " getAge());
        }
}
  

Класс контакта

 public class Contact {
    private String address;
    private String email;
    private String contactNumber;

    public Contact(String address,String contactNumber, String email){
        setAddress(address);
        setContactNumber(contactNumber);
        setEmail(email);
    }

    public void setAddress(String address){
        this.address = address;
    }

    public String getAddress(){
        return address;
    }

    public void setEmail(String email){
        this.email = email;
    }

    public String getEmail(){
        return email;
    }

    public void setContactNumber(String contactNumber){
        this.contactNumber = contactNumber;
    }

    public String getContactNumber(){
        return contactNumber;
    }

    public String toString(){
        return String.format("Address: " getAddress() "nContact Number: " getContactNumber() 
                                "nEmail Address: " getEmail());
    }
}
  

Класс Employee

 public class Employee {
    private Personal personal;
    private Contact contact;

    public Employee(Personal personal, Contact contact){
        this.personal = personal;
        this.contact = contact;
    }

    public void setFirstName(String firstName){
        this.personal.setFirstName(firstName);
    }

    public String toString(){
        return String.format(personal.toString() contact.toString());
    }
}
  

И тестовый класс

 public class TestClass {

    public static void main(String[] args){
        Personal personalHerp = new Personal("John","M","Doe",18);
        Contact contactHerp = new Contact("88 Herp Derp St U mad New york","724-15-70","fido.com");
        Employee employeeHerp = new Employee(personalHerp,contactHerp);
        System.out.println(employeeHerp);
    }
}
  

Комментарии:

1. Не могли бы вы сказать что-нибудь о модели, которую вы пытаетесь создать, и какие отношения вы хотите смоделировать? Там есть некоторые ассоциации, но без информации о том, чего вы пытаетесь достичь, трудно ответить на ваш вопрос.

2. почему String.format в методах toString()? Просто удалите вызов этого метода. String.format полезен для String.format(«Hello %s!»,»world»), который выдает одну строку «Hello world!». В вашем случае — это не нужно. Просто напишите «return personal.toString() contact.toString()».

3. иван сопов, что я буду использовать? тогда? Я хочу вернуть все атрибуты в текст в моем личном и контактном классе

4. чуваки, все, что он / она спросил, было ли это отношением has-a (и это так). зачем беспокоить его / ее (и, следовательно, путать его / ее) обо всем остальном. позвольте ему / ей учиться в своем темпе и переходить к строковым материалам позже, как только он / она поймет «has-a».

Ответ №1:

Ну, поскольку Employee не распространяется Personal , у него есть a Personal и a Contact .

Я думаю, вы бы предпочли Employee быть a Personal и, следовательно, это должно выглядеть так:

 public class Employee extends Personal {
  private Contact contact;
  ...
}
  

Итак, подведем итог:

  • is-a означает, что класс / объект расширяет другой класс или реализует интерфейс, т.Е. A является B, если A extends B или A implements B
  • has-a означает, что класс / объект имеет переменную такого типа, как Contact contact в вашем Employee классе, что означает Employee has-a contact .

Комментарии:

1. но я уже делал это с моим прошлым моделированием классов, но в итоге у меня получилось 12 конструкторов, извините за имя с опечаткой, но на самом деле это персональная информация, в любом случае, больше предложений?

2. Подумайте немного, прежде чем создавать структуру классов, и решите, что тесно связано с Personal -s, а что нет. Тесно связанные вещи должны быть отнесены к суперклассу, остальное, что может быть атрибутами других объектов (например, контактная информация, местоположение или что-то еще), должно быть отнесено к отдельным классам.

3. Я понимаю, но если я это сделаю, у меня будет 5 параметров в моем конструкторе, разве это не плохо?

4. @KyelJmD Это зависит от того, каковы эти параметры, но 5 параметров не так уж и плохи. Однако вы можете создать объект контейнера, подобный вашему PersonalInformation (в этом случае Personal он может иметь PersonalInformation атрибут).

Ответ №2:

Да, это отношения «has-a» (точно так же, как мы обсуждали в вашем другом вопросе).