ОО программирование о состоянии

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

Предположим, что у людей может быть семейное положение: холост, женат, вдова, разведен. Создайте OODP состояния (например, Java, JavaScript, C++, Python или Ruby), который занимается семейным положением людей. У вас будет как минимум два класса: лицо и семейное положение. Убедитесь, что соблюдаются следующие правила: холост -> женат - женат -> разведен | вдова разведена -> вдова замужем -> замужем создайте класс Client для тестирования вашей программы. Убедитесь, что вы проверили действительное и недействительное изменение семейного положения. Страница задания


Это мои коды:

public class AssignmentOOP {
    public static void main(String[] args) {
        Person p1 = new Person("p1");
        Person p2 = new Person("p2");
        Person p3 = new Person("p3");
        p1.PrintMaritalStatus();
        p2.PrintMaritalStatus();
        p3.PrintMaritalStatus();
        p1.GetMarried(p2);
        p1.GetMarried(p3);
        p2.Died();
        p1.GetMarried(p3);
    }
}

class Person {
    String maritalstatus;
    boolean mateIsAlive;
    Person mate;
    String name;

    Person(String name1) {
        maritalstatus = "single";
        mate = null;
        name = name1;
    }

    void GetMarried(Person mate) {
        if (this.maritalstatus.equals("married")|| mate.maritalstatus.equals("married"))
        {
            System.out.println("Marital status error! At least one of you are married");
            return;
        } else {
            this.maritalstatus = "married";
            this.mate = mate;
            mate.maritalstatus = "married";
            mate.mate = this;
            System.out.println("Congratulations!!! " + this.name + " and " + mate.name + " are married!");
        }
    }

    void GetDivorced(Person mate) {
        if (this.maritalstatus.equals("married") && this.mate == mate) {
            maritalstatus = "divorced";
            System.out.println(this.name+" and "+mate.name+" are getting divorced.");
        }else if (this.maritalstatus.equals("single")) {
            System.out.println("You are not married and you cannot get divorced before getting married");
        }else if (maritalstatus.equals("widow")) {
            System.out.println("Your marital status is widow, you cannot get divorced.");
        }
    }

    void Died() {
        this.maritalstatus = "dead";
        this.mate.maritalstatus = "widow";
        System.out.println("Sorry for your loss, " + this.mate.name + " marital status is widow.");
    }

    void PrintMaritalStatus() {
        System.out.println(this.name + " marital status is " + this.maritalstatus);
    }
}

Добро пожаловать в Stack Overflow! Пожалуйста, возьмите тур и посетите наш центр помощи, чтобы узнать, какие вопросы подходят для этого сайта. Если вы можете редактировать ваш вопрос в соответствии с требованиями этого сайта, сделайте это.

Joe C 26.11.2018 09:11

Несвязанный: прочтите о правилах именования java. имена методов должны строиться вокруг глаголов, и они идут в формате camelCase (). В java только имена классов начинаются с UpperCase.

GhostCat 26.11.2018 09:23

Ваш профессор сказал, что вам нужно использовать только 2 класса или вы можете использовать даже больше 2?

Roman 26.11.2018 14:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
204
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Здесь:

String maritalstatus;

Вероятно, это нет, чего хочет ваш профессор. Суть этого семейного положения в том, что существует только фиксированный набор ценностей.

Правильный способ выразить это - использовать перечислить в java, например:

public enum MaritalStatus { SINGLE, MARRIED, ... } 

Затем вы могли бы еще больше улучшить это, создав Государственный аппарат, который реализует правила, такие как: когда вы ОДИНОЧНЫЙ, и doMarry(), ваш новый статус должен быть впоследствии ЗАВЕРШЕН.

Когда профессор сказал студенту использовать такой язык, как Javascript или Ruby, профессор, на мой взгляд, захотел бы другое решение, чем enum.

Roman 26.11.2018 14:30

@Roman Вопрос помечен как Java, этого было достаточно для меня, чтобы дать ориентированный на Java ответ ;-)

GhostCat 26.11.2018 14:34
Ответ принят как подходящий

Перед копированием и прошивкой ..

Возможно, это решение не то, что хочет ваш профессор. Есть несколько других решений, которые можно использовать в этом сценарии.

В следующем решении Я предполагаю, что вы можете использовать только 2 класса!

Возможное решение

Ваш Person должен иметь поле типа MaritalState. Этот MaritalState отслеживает состояние Person, поэтому ему не нужно делать это самостоятельно.

Следующее - это просто быстро и грязно, и оно показывает вам идею агрегации.

Человек

Person теперь делегирует всю логику, которая зависит от MaritalState, на MatrialState.

public class Person {

  MaritalState maritalState;
  Person mate;
  String name;

  Person(String name1) {
    maritalState = new MaritalState();
    mate = null;
    name = name1;
  }

  void GetMarried(Person mate) {
    maritalState.marry(this, mate);
  }

  void GetDivorced(Person mate) {
    maritalState.divorce(this, mate);
  }

  void Died() {
    maritalState.die(this);
  }

  void PrintMaritalStatus() {
    System.out.println(this.name + " maritalState status is " + this.maritalState.get());
  }

  public boolean isMarried() {
    return maritalState.isMarried(maritalState);
  }

  public boolean isSingle() {
    return maritalState.isSingle(maritalState);
  }

  public boolean isWidow() {
    return maritalState.isWidow(maritalState);
  }
}

Семейное государство

Логика, которая была в Person, теперь находится в состоянии Martiral. Я расширяю некоторые функции, например isSingle(), чтобы код был более читабельным.

public class MaritalState {

  private static final String MARRIED = "married";
  private static final String SINGLE = "single";
  private static final String WIDOW = "widow";

  private String state;

  private MaritalState(String state) {
    this.state = state;
  }

  public MaritalState() {
    this.state = "single";
  }

  void marry(Person person, Person mate) {
    if (person.isMarried() || mate.isMarried()) {
      System.out.println("MaritalState status error! At least one of you are married");
    } else {
      person.maritalState = new MaritalState(MARRIED);
      person.mate = mate;
      mate.maritalState = new MaritalState(MARRIED);
      mate.mate = person;
      System.out.println("Congratulations!!! " + person.name + " and " + mate.name + " are married!");
    }
  }

  void divorce(Person person, Person mate) {
    if (person.isMarried() && person.mate == mate) {
      person.maritalState = new MaritalState("divorced");
      System.out.println(person.name + " and " + mate.name + " are getting divorced.");
    } else if (person.isSingle()) {
      System.out.println("You are not married and you cannot get divorced before getting married");
    } else if (person.isWidow()) {
      System.out.println("Your maritalState status is widow, you cannot get divorced.");
    }
  }

  void die(Person person) {
    person.maritalState = new MaritalState("dead");
    person.mate.maritalState = new MaritalState("widow");
    System.out.println("Sorry for your loss, " + person.mate.name + " maritalState status is widow.");
  }

  public boolean isMarried(MaritalState maritalState) {
    return maritalState.state.equals(MARRIED);
  }

  public boolean isSingle(MaritalState maritalState) {
    return maritalState.state.equals(SINGLE);
  }

  public boolean isWidow(MaritalState maritalState) {
    return maritalState.state.equals(WIDOW);
  }

  public String get() {
    return state;
  }
}

Другие вопросы по теме