2017-02-06 24 views
1

Я новичок в ООП и стараюсь самостоятельно учиться.Передача метода get в заданном методе

Я не уверен, о логической реализации этой простой (я чувствую, что это очень просто, но у меня есть ментальный блок) упражнение:

  • Создать Employee класс, с name, surname и salary поля
  • Создайте 2 сотрудника и распечатайте их зарплату после 10% -ного увеличения.

Итак, вот мои файлы:

// employee.h 

#ifndef EMPLOYEE_H 
#define EMPLOYEE_H 

#include <string> 
    using std::string; 


class Employee { 


private: 
    string name; 
    string surname; 
    float salary; 

public: 
    Employee(string,string,float); 
    void setName(string); 
    void setSurname(string); 
    void setSalary(float); 
    string getName(); 
    string getSurname(); 
    float getSalary(); 

}; 


#endif // EMPLOYEE 

employee.cpp 
#include "employee.h" 

Employee::Employee(string n,string c,float stip) { 

Employee::setName(n); 
Employee::setSurname(c); 
Employee::setSalary(stip); 

} 


void Employee::setName(string n){ 

name=n; 

} 
void Employee::setSurname(string c){ 

surname=c; 

} 

void Employee::setSalary(float stip){ 

salary=(stip>=0)?stip:0; 

} 


string Employee::getName(){ 


return name; 

} 

string Employee::getSurname(){ 


return surname; 

} 

float Employee::getSalary(){ 

return salary; 

} 

increase.h 
#ifndef INCREASE_H 
#define INCREASE_H 

namespace Increase { 

    const float inc2017=1.1; 

} 



#endif // INCREASE_H 

О том, что основной файл я рассмотренного 2 возможности:

1) Использование переменная для локального сохранения зарплаты

float prov=a.getSalary(); 

a.setSalary(prov*Increase::inc017); 

2) Передача метода GET в методе набора:

a.setSalary(a.getSalary()*Increase::inc2017); 

Что лучше?

Является ли номер 2 логически правильным или я обхожусь в обход инкапсуляции таким образом?

(я знаю, что это не было действительно необходимо с помощью заголовка пространства имен в этой небольшой проблемой, но я работаю в сторону более крупного проекта, и я хотел бы быть морально готовы к этому)

+2

Этот вопрос не имеет ничего общего с геттерами и сеттерами или инкапсуляцией, и почти весь код, который вы опубликовали, не имеет значения. Вы просто спрашиваете, следует ли предварительно получить результат вызова функции в переменную перед ее использованием? И это субъективный вопрос. –

+3

Почему вы не делаете функцию 'увеличитьSalaryBy'? =) – SingerOfTheFall

+1

^I второй @SingerOfTheFall всецело. Инкапсуляция связана с программной логикой, а не с прямым доступом к переменной, насколько это возможно. – StoryTeller

ответ

1

Чтобы ответить на конкретный вопрос, который у вас был: отлично, чтобы не использовать временную переменную при установке нового значения.

После того, как значение будет извлечено, он не сможет разрушить инкапсуляцию, потому что мы говорим о коде, который вообще не касается внутренних объектов.

Решение, предлагаемое в комментариях, которое может сделать класс более закрытым/конкретным, будет посвященной функцией «увеличение по», но вам решать, должен ли этот класс обладать этой функциональностью или вы, например, хотите делегировать увеличение другому компоненту.

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

0

Ваша функция геттер:

float Employee::getSalary(){ 

    return salary; 

} 

Обратите внимание, что эта функция возвращает копию зарплаты члена. Пользователь этой функции никак не может изменить значение переменной-члена salary.

Если ваша функция getter вернула ссылку на salary, пользователь, возможно, смог изменить значение переменной salary, тем самым нарушив инкапсуляцию.

float& Employee::getSalary(){ 

    return salary; 

} 

Итак, вы не должны беспокоиться о нарушении инкапсуляции с помощью функции геттера, которую вы написали.

+1

Возвращение ссылки на 'зарплата' ** - ** нарушение инкапсуляции. Почему бы не объявить «зарплату» публичной? было бы иначе, от точки инкапсуляции? –

+0

Возвращение ссылки на частного пользователя с помощью функции getter также является хорошим объявлением участника. – Rishi

+0

@Rishi Я бы не согласился. Вы должны добавить другой метод абсолютно без причины. –