Skip to content
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

Open
wants to merge 9 commits into
base: master
Choose a base branch
from

Conversation

Rinat-A-For-GeekBrains
Copy link

No description provided.

}


private final List<Person> children = new ArrayList<>();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Все поля описываются вверху класса, а только потом конструкторы и методы


public void setMother(Person mother) {
this.mother = mother;
mother.addChild(this);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это не очень хорошо. Класс Person должен отвечать только за свое состояние. Не должен менять состояния других объектов. Вот класс Дерева вполне может содержать такие операции, потому что его задача это работа со списком людей

Person person3 = new Person("Petya");

person2.setFather(person1);

Copy link
Owner

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) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Метод загрузки ничего не должен принимать в качестве аргумента, но должен возвращать ранее сохраненный объект, то есть не должен быть void

Comment on lines 29 to 30
FamilyTree familyTree = (FamilyTree) objectInputStream.readObject();
System.out.println(familyTree);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет смысла выводить в консоль. Надо вернуть древо для дальнейшей работы

Comment on lines 39 to 45
public void save(Writable writable) {
writable.save(this);
}

public void load(Writable writable) {
writable.load();
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Класс дерева не должен выполнять действия по сохранению и загрузке. Наоборот над деревом должны выполнять эти действия. Из за этого непонимание того, как реализовать загрузку) Потому что вроде как метод load возвращает объект, но что делать с этим объектом в рамках текущего класса непонятно

Comment on lines 47 to 49
public void sortByName(Comparator<T> comparator) {
familyTree.sort(comparator);
}
Copy link
Owner

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> {
Copy link
Owner

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;
Copy link
Owner

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<>();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Семейное дерево это только часть модели. например есть еще Filehandler. Для объединения работы модели требуется создать сервис.

Comment on lines 37 to 46
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
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Содержание логики приложения также не входит в круг обязанностей презентера. Диалог должна осуществлять view составляющая проекта полностью. Пример реализации смотри на семинаре

Comment on lines 21 to 25
StringBuilder stringBuilder = new StringBuilder();
for (Person person : familyTree) {
stringBuilder.append(person);
}
return stringBuilder.toString();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Скорее это будет метод дерева. Его метод toString. Считаю это нарушением первого принципа солид

Comment on lines 42 to 45
switch (savingType) {
case FILE -> {
writable = new FileHandler();
}
Copy link
Owner

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 {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Странно, что этот enum лежит в пакете презентера. логичней было бы в пакете writable

Comment on lines 93 to 101
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);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

нарушает второй принцип солид

Comment on lines 19 to 21
switch (choice) {
case 1:
UI.print("Введите имя");
Copy link
Owner

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);
Copy link
Owner

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
Comment on lines +17 to +21
Gender gender;
if (sGender.equals("M"))
gender = Gender.MALE;
else
gender = Gender.FEMALE;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

пол можно было определять на стороне view

Comment on lines +62 to +70
void Personmake() {
PersonBuilder personBuilder = new PersonBuilder();
Person person = personBuilder
.create()
.buildName("Petya")
.buildDateOfBirth(LocalDate.now())
.buildDateOfDeath(LocalDate.now())
.build();
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так а смысл в методе, если он не возвращает результат?

Copy link
Owner

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;
Copy link
Owner

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) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не увидел соответствующей команды в консоли. Лучше было бы передавать не Person, а например имя человека (считаем, что все имена уникальны). По этому имени можно найти объект Person и уже потом между объектами создать связь

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants