jackson
Участник
Offline
|
|
« : 07-11-2011 20:16 » |
|
Доброго времени суток! Опыт программирования на java у меня практически нулевой,но столкнулся с задачей,которую необходимо реализовать: Создать абстрактный класс Сотрудник. У него должны быть методы для задания ставки (з/п в месяц при 100% отработки), количества отработанных часов, а также методы для получения процента отработанного времени и зарплаты за месяц. Сотрудники могут быть двух типов: Программист и Менеджер. Программист получает зарплату в соответствии с количеством отработанных часов, а менеджер - 100% в случае переработки и соответствующий процент в случае недоработки. Класс Бухгалтер принимает множество сотрудников и считает их з/п. Для него должно быть прозрачным, какого типа является сотрудник. Ему важна только зарплата за текущий месяц. Создать нужно 4 класса: сотрудник,менеджер,программист,бухгалтер. класс сотрудник,менеджер и программист я создал,но не понимаю, нафиг нужен класс бухгалтер,если у меня зарплата считается в менеджере и программисте,но класс "бухгалтер" должен быть обязательно;класс бухгалтер должен наследовать сотрудника или не обязательно?как вообще подсчёт зарплаты в этом классе организовать?Заранее спасибо за советы. Вот собственно то,что я уже набросал: abstract class Employee { private int ID; public String name; public String role; public int FixedSalary; public int worckedHours; public Employee() { ID++; } public final int getID() { return ID; } public void setName(String name) { this.name=name; } public void setRole(String role) { this.role=role; } public int setFixedSalary(int FixedSalary) { return this.FixedSalary=FixedSalary; } public int setWorckedHours(int worckedHours) { return this.worckedHours=worckedHours; } public int getWorckedHours() { return worckedHours; } public int getFixedSalary() { return this.FixedSalary; } public String getName() { return name; } public String getRole() { return role; } public abstract int getPercent(); public abstract int getFullSalary(); } class Developer extends Employee { static private final int HOURS_FOR_MONTH = 160; static private final int MAX_SALARY=5000; public int getPercent() { return getWorckedHours()*100/HOURS_FOR_MONTH; } public int getFullSalary() { return getFixedSalary()*100/MAX_SALARY; } } class Manager extends Employee { static private final int HOURS_FOR_MONTH = 160; static private final int MAX_SALARY=4000; public int getPercent() { if(getWorckedHours()>HOURS_FOR_MONTH) { return 100; } return getWorckedHours()*100/HOURS_FOR_MONTH; } public int getFullSalary() { return getFixedSalary()*100/MAX_SALARY; } }
|
|
« Последнее редактирование: 08-11-2011 15:34 от Джон »
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #1 : 08-11-2011 00:08 » |
|
... но класс "бухгалтер" должен быть обязательно;класс бухгалтер должен наследовать сотрудника или не обязательно? Так это вопросы к постановщику задачи - что дальше планируется с этими классами? По идее бухгалтер тоже должен получать з/п (голую ставку), но в отличии от программиста - он имеет доступ к з/п других сотрудников. ИМХО начинать нужно с прорисовки (хотя бы общих чертах) полной модели приложения
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #2 : 08-11-2011 06:38 » |
|
нафиг нужен класс бухгалтер,если у меня зарплата считается в менеджере и программисте Ну, как один из вариантов, программист может не сам считать зарплату, а запрашивать её у бухгалтера. Мало ли, ему менеджер премию выписал Но в целом, согласен с Kivals: надо понимать, как эти все сущности друг с другом связаны, построить модель этого взаимодействия (например, как появляется новый сотрудник - регистрируется у бухгалтера? у менеджера?).
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 08-11-2011 08:52 » |
|
но не понимаю, нафиг нужен класс бухгалтер,если у меня зарплата считается в менеджере и программисте Правильный вопрос: а почему у тебя зарплата считается в менеджере и программисте? Разве IRL это так? Разве IRL они считают свою зарплату и сообщают её бухгалтеру?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
jackson
Участник
Offline
|
|
« Ответ #4 : 08-11-2011 09:27 » |
|
как вариант,я думаю,методы подсчёт зарплаты и процента отработанного времени нужно в классах программист и менеджер сделать абстрактными(так как эти методы наследуются ими из класса сотрудник),а в классе бухгалтер создать метод подсчёта зарплаты и принимать в этот метод параметр типа Сотрудник. Далее он должен через instanceof проверять, какого типа этот сотрудник - программист или менеджер, и в зависимости от этого высчитывать процентную ставку.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 08-11-2011 09:50 » |
|
Не понимаю чем отличается Сотрудник, Менеджер, программист, бухгалтер друг от друга, кроме кк обязанностей и методов начисления зарплаты. Сотрудник - Личные данные - Программист -сотрудник-зарплата-(метод начисления)отработанное время-доступ разрешен только к просмотру зарплаты самого себя. Менеджер -сотрудник-зарплата-(Метод начисления)отработанное время-доступ разрешен к редактированию з/пл программиста, запрещен к изменению самого себя - только просмотр Бухгалтер - сотрудник -зарплата-(метод начисления) - доступ разрешен к изменению/начислению зарплаты всех сотрудников
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
jackson
Участник
Offline
|
|
« Ответ #6 : 08-11-2011 09:56 » |
|
это понятно;мне только не совсем понятно,как организовать сам подсчёт в классе бухгалтер
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 08-11-2011 10:20 » |
|
А кто сказал что это должно делаться в классе бухгалтера. Доступ к начислению может иметь только бухгалтер
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
jackson
Участник
Offline
|
|
« Ответ #8 : 08-11-2011 10:24 » |
|
вобще-то в задании сказано,что в бухгалтер считает зарплату
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 08-11-2011 10:26 » |
|
А я говорю что-то другое?
Ладно создавай класс бухгалтер, а внем метод - считать зряплату, на вход поступают все сотрудники.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
jackson
Участник
Offline
|
|
« Ответ #10 : 08-11-2011 10:28 » |
|
протупил) да я уже,в общем-то,так и собираюсь сделать)
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #11 : 08-11-2011 10:35 » |
|
Я тебе даже по секрету скажу. Зарплату должен начислять не бухгалтер, а сотрудник с определенным табельным номером, и пусть он будет хоть паровозом, но он имеет право начислять зарплату.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
jackson
Участник
Offline
|
|
« Ответ #12 : 08-11-2011 13:26 » |
|
в общем получилась такая прога: abstract class Employee { private int ID; public String name; public String role; public int Salary; public int worckedHours; public void setName(String name) { this.name=name; } public void setRole(String role) { this.role=role; } public int setSalary(int Salary) { return this.Salary=Salary; } public int setWorckedHours(int worckedHours) { return this.worckedHours=worckedHours; } public int getWorckedHours() { return worckedHours; } public int getSalary() { return this.Salary; } public String getName() { return name; } public String getRole() { return role; } public abstract float getPercent(); public abstract float getFullSalary(); class Developer extends Employee { static private final int HOURS_FOR_MONTH = 160; public float getPercent() { return getWorckedHours()*100/HOURS_FOR_MONTH; } public float getFullSalary() { return (getSalary()/HOURS_FOR_MONTH)*getWorckedHours(); } } class Manager extends Employee { static private final int HOURS_FOR_MONTH = 160; public float getPercent() { if(getWorckedHours()>HOURS_FOR_MONTH) { return getSalary(); } return getWorckedHours()*100/HOURS_FOR_MONTH; } public float getFullSalary() { return (getSalary()/HOURS_FOR_MONTH)*getWorckedHours(); } } class Accountant { public float calculateFullSalary (Employee[] employers) { float sum=0; for (Employee emp : employers) sum=emp.getFullSalary(); return sum ; } } public abstract class salar {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Developer developer = new Developer(); Manager manager = new Manager(); Accountant accountant = new Accountant(); developer.setName("Fedor"); developer.setRole("Developer"); developer.setSalary(3000); developer.setWorckedHours(100); manager.setName("Ivan"); manager.setRole("Manager"); manager.setSalary(4200); manager.setWorckedHours(120); Employee[] emp = new Employee[]{developer, manager}; accountant.calculateFullSalary(emp); System.out.println("Данные о сотрудниках:"); System.out.println("Имя:"+developer.getName()+"Должность:"+developer.getRole()+"Количество отработанных часов:"+developer.getWorckedHours()+"Фиксированная ставка:"+developer.getSalary()+"Зарплата за месяц:"+accountant.calculateFullSalary(emp)); System.out.println("************************************************************"); System.out.println("Имя:"+manager.getName()+"Должность:"+manager.getRole()+"Количество отработанных часов:"+manager.getWorckedHours()+"Фиксированная ставка:"+manager.getSalary()+"Зарплата за месяц:"+accountant.calculateFullSalary(emp));
}
} и такой вывод: ----------------- Данные о сотрудниках: Имя:FedorДолжность:DeveloperКоличество отработанных часов:100Фиксированная ставка:3000Зарплата за месяц:3120.0 ************************************************************ Имя:IvanДолжность:ManagerКоличество отработанных часов:120Фиксированная ставка:4200Зарплата за месяц:3120.0 --------------- не могу понять, в чём проблема?
|
|
« Последнее редактирование: 08-11-2011 15:34 от Джон »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #13 : 08-11-2011 14:34 » |
|
С самого начала хотел спросить, а почему некоторые сеттеры что-то возвращают?
Теперь по вопросу.
то это? float sum=0; for (Employee emp : employers) sum=emp.getFullSalary();
а где сама сумма?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #14 : 08-11-2011 14:40 » |
|
Потому что пляшете не от той печки, потому так и выходит.
В чём задача? Посчитать зарплату. Выполнять эту задачу должен бухгалтер. Есть какие-то сотрудники, для которых по-разному считаются зарплаты.
Классификации должны подвергаться не сотрудники, а методы начисления зарплаты. Примеры: оклад, сдельная, разные виды премирования и надбавок - и т.д. У сотрудников должны быть возможность хранить внутри себя список всех видов начислений, которые к данному сотруднику применяются. Это же и даёт гибкость в управлении кадрами - можно сотруднику изменить порядок начисления тех же премий без всяких модификаций исходного кода, просто заменив один экземпляр на другой.
Называется это всё шаблон проектирования "стратегия".
Задача бухгалтера, таким образом, сводится к тому, чтобы перебрать всех сотрудников, а у каждого сотрудника - все его зарплатные "опции" вычислить, просуммировать и вывести в какой-нибудь табель.
Особый момент здесь тот, что разные стратегии зависят от разных атрибутов сотрудников: для каких-то расчётов нужно знать количество рабочих часов в месяц, для других, например, - сумму сделок, заключённых менеджером по продажам, для третьих - отклонение от каких-то нормативных показателей.
Поэтому помимо классификации по видам начислений ещё нужна классификация по видам данных, необходимых для применения стратегий.
P.S. Тему в "Технологии разработки ПО".
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
jackson
Участник
Offline
|
|
« Ответ #15 : 08-11-2011 14:42 » |
|
с сеттерами тупанул,уже исправил; sum это переменная для хранения зарплаты,просто надо было по-другому её назвать
Добавлено через 3 минуты и 18 секунд:
Dimka,спасибо за совет)
|
|
« Последнее редактирование: 08-11-2011 14:45 от jackson »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #16 : 08-11-2011 14:55 » |
|
я указал на ошибку
accountant.calculateFullSalary(emp); ---- Здесь она непраильно считается ПОСЧИТАЛИ всех ..... accountant.calculateFullSalary(emp)); System.out.println("************************************************************"); ..... accountant.calculateFullSalary(emp));
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
jackson
Участник
Offline
|
|
« Ответ #17 : 08-11-2011 14:58 » |
|
а как её исправить? просто я в джаве пока ещё полный нубяра,пока не доганяю
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #18 : 08-11-2011 15:07 » |
|
хм... я в jave уще полнее НОЛЬ А что там исправлять, ты что не сам код писал? Тогда, Димка просил в Технологии, а я прошу к Начинающим sum=0 for i=1 to N { sum = sum + i } У тебя код расчета общей зарплаты похож на это?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
jackson
Участник
Offline
|
|
« Ответ #19 : 08-11-2011 15:10 » |
|
нет.не похож)
Добавлено через 1 минуту и 27 секунд: чёто я в цикл не совсем въехал... а куда мне тогда девать for (Employee emp : employers)?
|
|
« Последнее редактирование: 08-11-2011 15:12 от jackson »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #20 : 08-11-2011 15:14 » |
|
как ты думаешь, как работает это цикл? Я догадываюсь
Он пробегает по каждому члену коллекции но не суммирует
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #21 : 08-11-2011 16:32 » |
|
Тогда, Димка просил в Технологии, а я прошу к Начинающим Ну ежели автору даже цикл непонятен, то, конечно, какие тут стратегии.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
|