-
Notifications
You must be signed in to change notification settings - Fork 69
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
HomeWork1 for Seminar1 #4
base: master
Are you sure you want to change the base?
HomeWork1 for Seminar1 #4
Conversation
src/ru/gb/family_tree/Person.java
Outdated
} | ||
|
||
|
||
private final List<Person> children = new ArrayList<>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Все поля описываются вверху класса, а только потом конструкторы и методы
src/ru/gb/family_tree/Person.java
Outdated
|
||
public void setMother(Person mother) { | ||
this.mother = mother; | ||
mother.addChild(this); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это не очень хорошо. Класс Person должен отвечать только за свое состояние. Не должен менять состояния других объектов. Вот класс Дерева вполне может содержать такие операции, потому что его задача это работа со списком людей
src/ru/gb/family_tree/Main.java
Outdated
Person person3 = new Person("Petya"); | ||
|
||
person2.setFather(person1); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А где вариант использования дерева?
} | ||
|
||
@Override | ||
public void load(Serializable serializable) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Метод загрузки ничего не должен принимать в качестве аргумента, но должен возвращать ранее сохраненный объект, то есть не должен быть void
FamilyTree familyTree = (FamilyTree) objectInputStream.readObject(); | ||
System.out.println(familyTree); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нет смысла выводить в консоль. Надо вернуть древо для дальнейшей работы
public void save(Writable writable) { | ||
writable.save(this); | ||
} | ||
|
||
public void load(Writable writable) { | ||
writable.load(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Класс дерева не должен выполнять действия по сохранению и загрузке. Наоборот над деревом должны выполнять эти действия. Из за этого непонимание того, как реализовать загрузку) Потому что вроде как метод load возвращает объект, но что делать с этим объектом в рамках текущего класса непонятно
public void sortByName(Comparator<T> comparator) { | ||
familyTree.sort(comparator); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Компаратор стоит создавать именно в методе сортировки. Иначе нет смысла например во втором методе сортировки. Ведь методы получились идентичны, за исключением названия метода
|
||
import java.util.Comparator; | ||
|
||
public class PersonComparatorByAge implements Comparator<Person> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Классы должны также использовать обобщения. Для возможности использовать в рамках класса СемейноеДерево
|
||
public class PresenterService { | ||
private FamilyTree<Person> familyTree = new FamilyTree<>(); | ||
private Scanner scanner; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Презентер не может работать со сканером. нет у него таких задач. Класс должен только связывать между собой модель и вью
import java.util.Scanner; | ||
|
||
public class PresenterService { | ||
private FamilyTree<Person> familyTree = new FamilyTree<>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Семейное дерево это только часть модели. например есть еще Filehandler. Для объединения работы модели требуется создать сервис.
switch (choice) { | ||
case 1: | ||
UI.print("Введите имя"); | ||
String name = UI.read(); | ||
UI.print("Введите пол. Если женский то Ж, если мужской то Ж"); | ||
String sGender = UI.read(); | ||
Gender gender; | ||
if (sGender.equals("M")) | ||
gender = Gender.MALE; | ||
else |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Содержание логики приложения также не входит в круг обязанностей презентера. Диалог должна осуществлять view составляющая проекта полностью. Пример реализации смотри на семинаре
StringBuilder stringBuilder = new StringBuilder(); | ||
for (Person person : familyTree) { | ||
stringBuilder.append(person); | ||
} | ||
return stringBuilder.toString(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Скорее это будет метод дерева. Его метод toString. Считаю это нарушением первого принципа солид
switch (savingType) { | ||
case FILE -> { | ||
writable = new FileHandler(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Свич кейс будет нарушать второй принцип солид. При попытке добавить новый вариант сохранения нам придется переписывать данный кусок кода. А если без свич кейса, то будет нарушен пятый принцип солид и при попытке использовать другой вариант сохранения опять же получим необходимость переписывать код. Два варианта решения показаны в 6 семинаре во второй задаче
@@ -0,0 +1,6 @@ | |||
package ru.gb.family_tree.presenter; | |||
|
|||
public enum SavingType { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Странно, что этот enum лежит в пакете презентера. логичней было бы в пакете writable
private void printMenu() { | ||
N = 0; | ||
System.out.printf("%d. Добавить члена семьи \n", ++N); | ||
System.out.printf("%d. Вывести информацию о семейном дереве\n", ++N); | ||
System.out.printf("%d. Сортировать членов семейного дерева по имени\n", ++N); | ||
System.out.printf("%d. Сортировать членов семейного дерева по возрасту\n", ++N); | ||
System.out.printf("%d. Сохранить в файл]\n", ++N); | ||
System.out.printf("%d. Загрузить из файла\n", ++N); | ||
System.out.printf("%d. Закончить работу\n", ++N); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
нарушает второй принцип солид
switch (choice) { | ||
case 1: | ||
UI.print("Введите имя"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
также нарушает второй принцип солид
gender = Gender.MALE; | ||
else | ||
gender = Gender.FEMALE; | ||
Person person = new Person(name, gender); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
View часть проекта не должна создавать Person это нарушение первого принципа солид. Person является частью модели и должен создаваться в модели
В package Service попытался создать классы по паттерну Builder. Пока нигде не задействованы.
доработан метод загрузки и выгрузки файла
доработан метод загрузки и выгрузки файла немного изменено MAinMenu
Gender gender; | ||
if (sGender.equals("M")) | ||
gender = Gender.MALE; | ||
else | ||
gender = Gender.FEMALE; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
пол можно было определять на стороне view
void Personmake() { | ||
PersonBuilder personBuilder = new PersonBuilder(); | ||
Person person = personBuilder | ||
.create() | ||
.buildName("Petya") | ||
.buildDateOfBirth(LocalDate.now()) | ||
.buildDateOfDeath(LocalDate.now()) | ||
.build(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Так а смысл в методе, если он не возвращает результат?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ну и странно, что дата рождения и смерти одинаковые)
import ru.gb.family_tree.view.View; | ||
|
||
public class Presenter { | ||
private View UI; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Капслоком обозначают обычно константы. В данном случае это не константа)
familyTree.sortByAge(); | ||
} | ||
|
||
public void addParent(Person person, Person child) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Не увидел соответствующей команды в консоли. Лучше было бы передавать не Person, а например имя человека (считаем, что все имена уникальны). По этому имени можно найти объект Person и уже потом между объектами создать связь
No description provided.