Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111

Наследование. Как сделать код лучше

21.06.2018, 21:19. Показов 1054. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Недавно изучаю java, и имею сейчас такую проблему. Задание следующее: сформировать штат сотрудников с параметрами загружаемыми из файла. Имеется базовый класс Employee, остальные наследуют от него. Также имеются интерфейсы, предоставляющие функционал расчета зарплаты. Вот, что я накропал:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
interface WorkTime{
    double getPayment();
}
interface Heading{
    double getPaymentForHeading();
 
}
interface Project{
    double getPaymentForProject();
}
class Employee {
    int id;
    String name;
    double workTime;
    double payment;
    String position;
}
 
class Engineer extends Employee implements WorkTime, Project{
    double rate;
    double workTime;
    double budget;
    double personalInput;
    double payment = getPayment()+getPaymentForProject();
    public double getPayment(){
        double payment=rate*workTime;
        return payment;
    }
    public double getPaymentForProject(){
        double payment=budget*personalInput;
        return payment;
    }
 
 
}
class Personal extends Employee implements WorkTime{
    double rate;
    double workTime;
    double payment = getPayment();
    public double getPayment(){
        double payment=rate*workTime;
        return payment;
    }
}
class Cleaner extends Personal{
    @Override
    public String toString() {
        return "Id: "+super.id+" Должность: "+position+" ФИО: "+super.name+" Ставка: "+super.rate;
    }
}
class Driver extends Personal{ }
 
class Manager extends Employee implements Project{
    double budget;
    double personalInput;
    double payment = getPaymentForProject();
    public double getPaymentForProject(){
        double payment=budget*personalInput;
        return payment;
    }
}
 
class Programmer extends Engineer{
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate+" Бюджет: "+budget;
    }
}
class Tester extends Engineer{
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate+" Бюджет: "+budget;
    }
}
class TeamLeader extends Programmer implements Heading{
    int subordinates;
    double rate;
    double payment=getPayment()+getPaymentForProject()+getPaymentForHeading();
    public double getPaymentForHeading(){
        payment =subordinates*rate;
        return payment;
    }
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate+" Бюджет: "+budget;
    }
}
class ProjectManager extends Manager implements Heading{
    int subordinates;
    double rate;
    double payment=getPaymentForProject()+getPaymentForHeading();
    public double getPaymentForHeading(){
        payment =subordinates*rate;
        return payment;
    }
}
class SeniorManager extends ProjectManager{
 
}
 
public class StaffDemo {
    List<Cleaner> cleaners=new ArrayList<Cleaner>();
    List<Driver> drivers=new ArrayList<Driver>();
    List<Programmer> programmers=new ArrayList<Programmer>();
    List<Tester> testers=new ArrayList<Tester>();
    List<TeamLeader> teamLeaders=new ArrayList<TeamLeader>();
    List<Manager> managers=new ArrayList<Manager>();
    List<ProjectManager> projectManagers=new ArrayList<ProjectManager>();
    List<SeniorManager> seniorManagers=new ArrayList<SeniorManager>();
 
    void loadStaff() throws ParserConfigurationException, IOException, SAXException {
        final File staff = new File(System.getProperty("user.dir")+"/Staff.xml");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(staff);
        NodeList nodeListCleaners = doc.getElementsByTagName("Cleaner");
        NodeList nodeListDrivers = doc.getElementsByTagName("Driver");
        NodeList nodeListProgrammers = doc.getElementsByTagName("Programmer");
        NodeList nodeListTesters = doc.getElementsByTagName("Tester");
        NodeList nodeListTeamLeaders = doc.getElementsByTagName("TeamLeader");
        NodeList nodeListManagers = doc.getElementsByTagName("Manager");
        NodeList nodeListProjectManagers = doc.getElementsByTagName("ProjectManager");
        NodeList nodeListSeniorManagers = doc.getElementsByTagName("SeniorManager");
        for (int i=0; i<nodeListCleaners.getLength(); i++ ){
            Node nextNode = nodeListCleaners.item(i);
            Cleaner cleaner = new Cleaner();
            cleaners.add(cleaner);
            NodeList childNodes = nextNode.getChildNodes();
            for (int j=0; j<childNodes.getLength();j++){
                Node nextChildNode = childNodes.item(j);
                if (nextChildNode.getNodeType()==Node.ELEMENT_NODE){
                    if(nextChildNode.getNodeName().equals("Id"))
                        cleaner.id=Integer.parseInt(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Name"))
                        cleaner.name=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Base"))
                        cleaner.rate=Double.parseDouble(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Position"))
                        cleaner.position=nextChildNode.getTextContent();
                }
            }
        }
        for (int i=0; i<nodeListDrivers.getLength(); i++ ){
            Node nextNode = nodeListDrivers.item(i);
            Driver driver = new Driver();
            drivers.add(driver);
            NodeList childNodes = nextNode.getChildNodes();
            for (int j=0; j<childNodes.getLength();j++){
                Node nextChildNode = childNodes.item(j);
                if (nextChildNode.getNodeType()==Node.ELEMENT_NODE){
                    if(nextChildNode.getNodeName().equals("Id"))
                        driver.id=Integer.parseInt(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Name"))
                        driver.name=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Base"))
                        driver.rate=Double.parseDouble(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Position"))
                        driver.position=nextChildNode.getTextContent();
                }
            }
        }
        for (int i=0; i<nodeListProgrammers.getLength(); i++ ){
            Node nextNode = nodeListProgrammers.item(i);
            Programmer programmer = new Programmer();
            programmers.add(programmer);
            NodeList childNodes = nextNode.getChildNodes();
            for (int j=0; j<childNodes.getLength();j++){
                Node nextChildNode = childNodes.item(j);
                if (nextChildNode.getNodeType()==Node.ELEMENT_NODE){
                    if(nextChildNode.getNodeName().equals("Id"))
                        programmer.id=Integer.parseInt(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Name"))
                        programmer.name=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Base"))
                        programmer.rate=Double.parseDouble(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Position"))
                        programmer.position=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Project")){
                        Element element =(Element)nextChildNode;
                        programmer.budget=Double.parseDouble(element.getAttribute("budget"));
                    }
                }
            }
        }
        for (int i=0; i<nodeListTesters.getLength(); i++ ){
            Node nextNode = nodeListTesters.item(i);
            Tester tester = new Tester();
            testers.add(tester);
            NodeList childNodes = nextNode.getChildNodes();
            for (int j=0; j<childNodes.getLength();j++){
                Node nextChildNode = childNodes.item(j);
                if (nextChildNode.getNodeType()==Node.ELEMENT_NODE){
                    if(nextChildNode.getNodeName().equals("Id"))
                        tester.id=Integer.parseInt(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Name"))
                        tester.name=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Base"))
                        tester.rate=Double.parseDouble(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Position"))
                        tester.position=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Project")){
                        Element element =(Element)nextChildNode;
                        tester.budget=Double.parseDouble(element.getAttribute("budget"));
                    }
                }
            }
        }
        for (int i=0; i<nodeListTeamLeaders.getLength(); i++ ){
            Node nextNode = nodeListTeamLeaders.item(i);
            TeamLeader teamLeader = new TeamLeader();
            teamLeaders.add(teamLeader);
            NodeList childNodes = nextNode.getChildNodes();
            for (int j=0; j<childNodes.getLength();j++){
                Node nextChildNode = childNodes.item(j);
                if (nextChildNode.getNodeType()==Node.ELEMENT_NODE){
                    if(nextChildNode.getNodeName().equals("Id"))
                        teamLeader.id=Integer.parseInt(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Name"))
                        teamLeader.name=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Base"))
                        teamLeader.rate=Double.parseDouble(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Position"))
                        teamLeader.position=nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Project")){
                        Element element =(Element)nextChildNode;
                        teamLeader.budget+=Double.parseDouble(element.getAttribute("budget"));
                    }
                }
            }
        }
Код в работе, кое-чего не хватает. Но налицо некрасивая вещь - код повторяется при извлечении данных из файла. Ломаю голову, как его улучшить. Вот данные файла:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Staff>
    <Cleaner>
        <Id>1</Id>
        <Name>Спиридонова Тамара Сергеевна</Name>
        <Position>Уборщица</Position>
        <Base>70</Base>
    </Cleaner>
    <Cleaner>
        <Id>2</Id>
        <Name>Петрова Наталья Карловна</Name>
        <Position>Уборщица</Position>
        <Base>70</Base>
    </Cleaner>
    <Cleaner>
        <Id>3</Id>
        <Name>Меркулова Анна Альбертовна</Name>
        <Position>Уборщица</Position>
        <Base>80</Base>
    </Cleaner>
    <Driver>
        <Id>4</Id>
        <Name>Наумов Петр Сергеевич</Name>
        <Position>Водитель</Position>
        <Base>150</Base>
    </Driver>
    <Driver>
        <Id>5</Id>
        <Name>Левин Тарас Викторович</Name>
        <Position>Водитель</Position>
        <Base>150</Base>
    </Driver>
    <Manager>
        <Id>6</Id>
        <Name>Абдурахманов Ашот Ашотович</Name>
        <Position>Менеджер</Position>
        <Base>200</Base>
        <Project budget="500000">StaffDemo</Project>
    </Manager>
    <Manager>
        <Id>7</Id>
        <Name>Рамзанов Рахман Рахманович</Name>
        <Position>Менеджер</Position>
        <Base>200</Base>
        <Project budget="700000">DekanatDemo</Project>
    </Manager>
    <Tester>
        <Id>8</Id>
        <Name>Павлов Виталий Андреевич</Name>
        <Position>Инженер по тестированию</Position>
        <Base>300</Base>
        <Project budget="700000">DekanatDemo</Project>
    </Tester>
    <Tester>
        <Id>9</Id>
        <Name>Лукьянов Лука Лукич</Name>
        <Position>Инженер по тестированию</Position>
        <Base>300</Base>
        <Project budget="700000">DekanatDemo</Project>
    </Tester>
    <Tester>
        <Id>10</Id>
        <Name>Брежнев Никита Сергеевич</Name>
        <Position>Инженер по тестированию</Position>
        <Base>300</Base>
        <Project budget="500000">StaffDemo</Project>
    </Tester>
    <Tester>
        <Id>11</Id>
        <Name>Васильев Василий Васильевич</Name>
        <Position>Инженер по тестированию</Position>
        <Base>300</Base>
        <Project budget="500000">StaffDemo</Project>
    </Tester>
    <Programmer>
        <Id>12</Id>
        <Name>Лаврентьев Лаврентий Лаврентьевич</Name>
        <Position>Инженер-программист</Position>
        <Base>400</Base>
        <Project budget="700000">DekanatDemo</Project>
    </Programmer>
    <Programmer>
        <Id>13</Id>
        <Name>Иванов Иван Иванович</Name>
        <Position>Инженер-программист</Position>
        <Base>400</Base>
        <Project budget="700000">DekanatDemo</Project>
    </Programmer>
    <Programmer>
        <Id>14</Id>
        <Name>Силантьев Силантий Силантьевич</Name>
        <Position>Инженер-программист</Position>
        <Base>400</Base>
        <Project budget="500000">StaffDemo</Project>
    </Programmer>
    <Programmer>
        <Id>15</Id>
        <Name>Петров Петр Петрович</Name>
        <Position>Инженер-программист</Position>
        <Base>400</Base>
        <Project budget="500000">StaffDemo</Project>
    </Programmer>
    <TeamLeader>
        <Id>16</Id>
        <Name>Зиновьев Зиновий Зиновьевич</Name>
        <Position>Ведущий программист</Position>
        <Base>500</Base>
        <Project budget="500000">StaffDemo</Project>
        <Project budget="700000">DekanatDemo</Project>
    </TeamLeader>
    <ProjectManager>
        <Id>17</Id>
        <Name>Аристархов Аристарх Аристархович</Name>
        <Position>Проектный менеджер</Position>
        <Base>500</Base>
        <Project budget="500000">StaffDemo</Project>
        <Project budget="700000">DekanatDemo</Project>
    </ProjectManager>
    <SeniorManager>
        <Id>18</Id>
        <Name>Аполлонов Аполлон Аполлинарьевич</Name>
        <Position>Руководитель направления</Position>
        <Base>600</Base>
        <Project budget="500000">StaffDemo</Project>
        <Project budget="700000">DekanatDemo</Project>
    </SeniorManager>
</Staff>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2018, 21:19
Ответы с готовыми решениями:

Написал код, нужна критика и советы как можно было бы сделать лучше
Задание №2: Написать программу, копирующую элементы 2-х массивов размером 5 элементов каждый в один массив размером 10 элементов следующим...

Наследование vs Композиция vs Агрегация: что лучше выбрать? Как лучше передавать объекты в функции?
Добрый день!! Дело вот в чём, я хочу создать класс, внутри которого будут созданы объекты других классов (реализованных в некоторой...

break или как сделать лучше код
Вообщем делал задание &quot;НАйти первый и последний нулевой элемент&quot;,так вот ,дан рабочий код,ну есть интересующий вопрос ,яхотел бы...

13
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
22.06.2018, 06:43
Njula,
Цитата Сообщение от Njula Посмотреть сообщение
Но налицо некрасивая вещь
именно, можно как пример показывать дублирования кода. Вынеси то, что повторяеся в отдельный метод, пуст он на вход принимает NodeList внутри выясняет кто конкретно ему попался (уборщики или водители) и парсит их.

Цитата Сообщение от Njula Посмотреть сообщение
List<Cleaner> cleaners=new ArrayList<Cleaner>();
начиная с 7 джавы можно в бриллиантике ничего не писать List<Cleaner> cleaners=new ArrayList<>();

инкапсуляция где? как мне не влазя в код понять разницу между payment и getPayment, если все доступно?
Цитата Сообщение от Njula Посмотреть сообщение
double payment=budget*personalInput;
* * * * return payment;
можно просто return budget*personalInput; нет нужды в лишней переменной
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
23.06.2018, 00:21  [ТС]
Спасибо! Я постарался код улучшить. Вот что получилось:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
interface WorkTime{
    double getPayment();
}
interface Heading{
    double getPaymentForHeading();
 
}
interface Project{
    double getPaymentForProject();
}
class Employee {
    protected int id;
    protected String name;
    protected double workTime;
    protected double payment;
    protected double rate;
    protected double budget;
    protected String position;
}
 
class Engineer extends Employee implements WorkTime, Project{
    protected double personalInput;
    protected double payment = getPayment()+getPaymentForProject();
    public double getPayment(){
        return rate*workTime;
    }
    public double getPaymentForProject(){
        return budget*personalInput;
    }
 
 
}
class Personal extends Employee implements WorkTime{
    protected double payment = getPayment();
    public double getPayment(){
        return rate*workTime;
    }
}
class Cleaner extends Personal{
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate+" Зарплата ="+payment;
    }
}
class Driver extends Personal{
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate;
    }
}
 
class Manager extends Employee implements Project{
    protected double personalInput;
    protected double payment = getPaymentForProject();
    public double getPaymentForProject(){
        return budget*personalInput;
    }
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+"Бюджет:"+budget;
    }
}
 
class Programmer extends Engineer{
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate+" Бюджет: "+budget;
    }
}
class Tester extends Engineer{
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate+" Бюджет: "+budget;
    }
}
class TeamLeader extends Programmer implements Heading{
    int subordinates;
    private double payment=getPayment()+getPaymentForProject()+getPaymentForHeading();
    public double getPaymentForHeading(){
        return subordinates*rate;
    }
 
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Ставка: "+rate+" Бюджет: "+budget;
    }
}
class ProjectManager extends Manager implements Heading{
    int subordinates;
    double payment=getPaymentForProject()+getPaymentForHeading();
    public double getPaymentForHeading(){
        return subordinates*rate;
    }
}
class SeniorManager extends ProjectManager{
 
}
 
public class StaffDemo {
    List<Employee> employees = new ArrayList<Employee>();
    
    final File file = new File(System.getProperty("user.dir")+"/Staff.xml");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(file);
    Node rootNode = doc.getFirstChild();
    NodeList nodeList = rootNode.getChildNodes();
   
    public StaffDemo() throws ParserConfigurationException, IOException, SAXException {
    }
 
    void loadStaff() throws ParserConfigurationException, IOException, SAXException {
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node nextNode = nodeList.item(i);
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("Cleaner")) {
                Employee employee = new Cleaner();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("Driver")) {
                Employee employee = new Driver();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("Programmer")) {
                Employee employee = new Programmer();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("Tester")) {
                Employee employee = new Tester();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("TeamLeader")) {
                Employee employee = new TeamLeader();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("Manager")) {
                Employee employee = new Manager();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("ProjectManager")) {
                Employee employee = new ProjectManager();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            if (nextNode.getNodeType()==Node.ELEMENT_NODE && nextNode.getNodeName().equals("SeniorManager")) {
                Employee employee = new SeniorManager();
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
        }
    }
       void parseListNode (NodeList childNodes, Employee employee){
        for (int j = 0; j < childNodes.getLength(); j++) {
            Node nextChildNode = childNodes.item(j);
            if (nextChildNode.getNodeType() == Node.ELEMENT_NODE) {
                if (nextChildNode.getNodeName().equals("Id"))
                    employee.id = Integer.parseInt(nextChildNode.getTextContent());
                if (nextChildNode.getNodeName().equals("Name"))
                    employee.name = nextChildNode.getTextContent();
                if (nextChildNode.getNodeName().equals("Base"))
                    employee.rate = Double.parseDouble(nextChildNode.getTextContent());
                if (nextChildNode.getNodeName().equals("Position"))
                    employee.position = nextChildNode.getTextContent();
                if (nextChildNode.getNodeName().equals("Project")) {
                    Element element = (Element) nextChildNode;
                    employee.budget += Double.parseDouble(element.getAttribute("budget"));
                }
            }
        }
 
    }
Код стал компактнее. Но возник вопрос - как посчитать зарплату(payment). Для этого нужно вызвать обратиться к полю payment каждого объекта в отдельности. Employee не имеет методов расчета payment. Узнать тип объекта в контейнере можно - getClass().getName(). Но можно ли так обратиться к объектам? И еще, я в класс Employe добавил практически все поля, встречающиеся у его потомков, это нужно было для добавления данных из файла при идентификации. Но кажется это не совсем верно. Может я сделал что не так?

Добавлено через 2 минуты
Насчет названия типа в "бриллиантике" - это intelijj сам добавляет, я знаю, что можно не писать.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
23.06.2018, 07:36
Njula,
Цитата Сообщение от Njula Посмотреть сообщение
Насчет названия типа в "бриллиантике" - это intelijj сам добавляет, я знаю, что можно не писать.
значит в настройке проекта стоит джава 6
Нажимаем в Идее Ctrl+Shift+Alt+S, выбираем вкладку проект, ставим джаву 8


всегда обращай внимание на все, что повторяется, например у тебя все методы toString почти одинаковы, так ты общую часть пропиши в родителе (Персонал) а в конкретных классах, только дописывай разницу, пример для менеджера
Java
1
2
3
4
@Override
    public String toString() {
        return super.toString()+"Бюджет:"+budget; // все, что до бюджета прописано в Персонал
    }
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
23.06.2018, 07:40
Цитата Сообщение от Njula Посмотреть сообщение
в класс Employe добавил практически все поля, встречающиеся у его потомков
именно так и нужно, все общее выносим в родителя, и почему кстати ты не вынес туда метод расчета зп, пусть и абстрактный? а в конкретных классах реализовывать согласно их правилам расчета

Добавлено через 1 минуту
строки со 115 по 162 должны превратиться в 1 короткий метод! это ж тот повтор кода с которым боремся
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
23.06.2018, 14:33  [ТС]
И снова спасибо за ваши ценные советы, Welemir1! Доработал код. Получилось вот что:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
interface WorkTime{
    double getPayment();
}
interface Heading{
    double getPaymentForHeading();
 
}
interface Project{
    double getPaymentForProject();
}
class Employee implements WorkTime, Heading, Project {
    protected int id;
    protected String name;
    protected double workTime;
    protected double payment;
    protected double rate;
    protected double budget;
    protected String position;
    protected double personalInput;
    protected int subordinates;
    public double getPayment() {
        return payment;
    }
 
    public double getPaymentForHeading() {
        return payment;
    }
 
    public double getPaymentForProject() {
        return payment;
    }
 
    @Override
    public String toString() {
        return "Id: "+id+" Должность: "+position+" ФИО: "+name+" Зарплата ="+payment;
    }
}
 
 
class Personal extends Employee implements WorkTime {
    protected double payment = getPayment();
 
    @Override
    public double getPayment() {
        return rate * workTime;
    }
 
    @Override
    public String toString() {
        return super.toString() + "Ставка: " + rate;
    }
}
class Cleaner extends Personal{}
 
class Driver extends Personal{}
 
class Engineer extends Employee {
    private double payment = getPayment() + getPaymentForProject();
 
    public double getPayment() {
        return rate * workTime;
    }
 
    public double getPaymentForProject() {
        return budget * personalInput;
    }
 
    @Override
    public String toString() {
        return super.toString() + "Ставка: " + rate + " Бюджет: " + budget;
    }
}
 
    class Programmer extends Engineer {}
 
    class Tester extends Engineer {}
 
    class TeamLeader extends Programmer {
        private double payment = getPayment() + getPaymentForProject() + getPaymentForHeading();
 
        public double getPaymentForHeading() {
            return subordinates * rate;
        }
    }
 
    class Manager extends Employee {
        protected double payment = getPaymentForProject();
 
        public double getPaymentForProject() {
            return budget * personalInput;
        }
 
        @Override
        public String toString() {
            return super.toString() + "Ставка: " + rate + " Бюджет: " + budget;
        }
    }
 
    class ProjectManager extends Manager{
        double payment = getPaymentForProject() + getPaymentForHeading();
 
        public double getPaymentForHeading() {
            return subordinates * rate;
        }
    }
 
    class SeniorManager extends ProjectManager {
    }
 
 
    public class StaffDemo {
        List<Employee> employees = new ArrayList<Employee>();
 
        final File file = new File(System.getProperty("user.dir") + "/Staff.xml");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(file);
        Node rootNode = doc.getFirstChild();
        NodeList nodeList = rootNode.getChildNodes();
 
        public StaffDemo() throws ParserConfigurationException, IOException, SAXException {}
 
        void loadStaff() throws ParserConfigurationException, IOException, SAXException {
            String[] pos = {"Cleaner", "Driver", "Programmer", "Tester", "TeamLeader", "Manager", "ProjectManager"};
            System.out.println(nodeList.getLength());
            Employee employee = null;
            for (int i = 0; i < nodeList.getLength(); i++){
                Node nextNode = nodeList.item(i);
                for (int j = 0; j < pos.length; j++) {
                    if (nextNode.getNodeType() == Node.ELEMENT_NODE && nextNode.getNodeName().equals(pos[j])){
                        switch (j) {
                            case 0:
                                employee = new Cleaner();
                                break;
                            case 1:
                                employee = new Driver();
                                break;
                            case 2:
                                employee = new Programmer();
                                break;
                            case 3:
                                employee = new Tester();
                                break;
                            case 4:
                                employee = new TeamLeader();
                                break;
                            case 5:
                                employee = new Manager();
                                break;
                            case 6:
                                employee = new ProjectManager();
                                break;
                        }
                    }
                }
                employees.add(employee);
                NodeList childNodes = nextNode.getChildNodes();
                parseListNode(childNodes, employee);
            }
            System.out.println(employees);
        }
 
        void parseListNode(NodeList childNodes, Employee employee) {
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node nextChildNode = childNodes.item(j);
                if (nextChildNode.getNodeType() == Node.ELEMENT_NODE) {
                    if (nextChildNode.getNodeName().equals("Id"))
                        employee.id = Integer.parseInt(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Name"))
                        employee.name = nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Base"))
                        employee.rate = Double.parseDouble(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("Position"))
                        employee.position = nextChildNode.getTextContent();
                    if (nextChildNode.getNodeName().equals("Project")) {
                        Element element = (Element) nextChildNode;
                        employee.budget += Double.parseDouble(element.getAttribute("budget"));
                    }
                }
            }
 
        }
 
        public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
            StaffDemo staff = new StaffDemo();
            staff.loadStaff();
        }
    }
Может быть, loadStaff можно как-то более элегантно реализовать, не знаю... Но сейчас непонятная мне вещь появилась. Когда я получаю nodeList по профессиям из rootNode, размер этого списка 37. Ну ладно, кроме Node там могут быть и другие элементы. В цикле вожу условие nextNode.getNodeType() == Node.ELEMENT_NODE и... выводятся 37 позиций по 2 каждой + null. Не пойму в чем дело... В xml все одном экземпляре.
Что касается toString(), то этот метод я ввел просто для контроля создания списка объектов. В дальнейшем все работники будут сведены в таблицу.
И конечно логичней было бы сразу прикрутить интерфейсы к базовому классу. Просто я следовал заданию на проект.
Миниатюры
Наследование. Как сделать код лучше  
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
23.06.2018, 18:45  [ТС]
С дублированием разобрался... Просто нужно было заполнение контейнера внести в область действия условия, в котором тип Node определяется.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
23.06.2018, 19:01
Njula, уже лучше, молодец, еще надо для работы с файлами использовать java.nio.Files а так для начинающего вполне. Еще конечно не очень хорошо все в одном файле, надеюсь у тебя какая то иерархия классов, раскиданная по файлам.
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
23.06.2018, 23:57  [ТС]
Спасибо! Похвала программиста дорогого стоит). Я действительно начинающий. Это мой первый такого рода проект. Но с java я успел сродниться). Буду творить дальше. Насчет java.nio.Files я поищу инфу... По файлам раскидаю. Вот у меня такой вопрос. В задании говорится, что штат сотрудников со всеми данными должны быть сведены в таблицу. Я честно говоря не совсем понимаю, как это. В какую таблицу. Но сейчас занимаясь расчетом зарплаты сотрудников, понимаю, что остальные данные для расчета - отработанное время, коэффициент участия, кол-во подчиненных, должны вводиться динамически, естественно для каждого отдельно. Я пока определил ввод этих данных через консоль. Но занятие это довольно муторное - вводить для каждого цифры. Так вот, нет ли возможности привязать к коду файл таблицы, скажем эксель, чтобы данные сводились туда, и были пустые ячейки, при вводе недостающих данных в которые, производился расчет зарплаты? Я даже не представляю, как это можно реализовать... А вдруг?)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
24.06.2018, 06:55
Njula, можно то конечно все можно, но ты попробуй сначала с простым файлом для начала, эксельку тебе тянуть мне кажется излишняя сложность. Сведены в таблицу не знаю что имелось в виду.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
24.06.2018, 07:02
Njula, пора почитать пр БД...
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.06.2018, 08:29
>>в таблицу. Я честно говоря не совсем понимаю, как это
Не понимаешь что такое таблица?
>>скажем эксель
А может прям в Экселе и считать зарплату и моск не насиловать?
Если уж хочется насиловать моск прочитай что такое CSV например
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
24.06.2018, 08:55
Njula, вместо того чтобы пытаться сделать код короче, подумай почему у тебя работники сами считают себе зарплату? Ты у себя на работе тоже сам себе зарплату считаешь? Захотел и накрутил себе мультипликатор х10 например да?
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
24.06.2018, 14:11  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
подумай почему у тебя работники сами считают себе зарплату?
критика по существу). похоже нужно создать класс Бухгалтерия). Я наверно излишне буквально следую заданию, в котором приведена иерархия классов.

Добавлено через 3 минуты
Цитата Сообщение от xoraxax Посмотреть сообщение
А может прям в Экселе и считать зарплату и моск не насиловать?
Об этом я тоже подумал. Конечно, все закинуть в Эксель и посчитать - и никакой код не нужен. Попробую выяснить что имелось ввиду под "таблицей" - отдельный это текстовый файл, просто форматированный текст или Эксель).

Добавлено через 3 минуты
Цитата Сообщение от iSmokeJC Посмотреть сообщение
пора почитать пр БД...
Видимо, да). До этого пока не дошел.

Добавлено через 2 часа 10 минут
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
почему у тебя работники сами считают себе зарплату?
Ввел класс Бухгалтерия. Код стал однозначно прозрачнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2018, 14:11
Помогаю со студенческими работами здесь

Как упростить, сделать лучше этот код
import random L1 = random.randint(0,24) R1 = random.randint(0,24) L2 = random.randint(25,49) R2 = random.randint(25,49) ...

Jlist, Jpanel, JTextField: как сделать код лучше?
import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*;...

Нужно изменить код, чтобы ПВГ завершалось на точке, которую задаёт пользователь, как лучше это сделать?
def run(): for v in range(n): dfs(v) def dfs(v): if used: return used = True print(v +...

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

Наследование,как сделать?
Создать базовый класс Car(машина), характеризуемый торговой маркой(строка), числом цилиндров, мощностью Определить методы переназначения и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru