Инкапсуляция в ООП

Я изучаю концепции ООП. Как я понял из документов, которые я прочитал, я написал пример программы для концепции инкапсуляции в ООП. Я вставил свой код ниже. Правильно ли мое представление об инкапсуляции?

Default.aspx

<asp:Button ID="showBtn" Text="Show employee details." runat="server"/>

Default.aspx.cs

public partial class _Default : System.Web.UI.Page
{
Employee emp;

protected void Page_Load(object sender, EventArgs e)
{
    emp = new Employee();
    emp.SetEmployeeID(001);
    emp.SetEmployeeSalary(5000);
    emp.EmployeeName = "Rob";
    emp.EmployeeAge = 26;

    showBtn.Click += new EventHandler(showBtn_Click);
}

void showBtn_Click(object sender, EventArgs e)
{
    emp.ShowEmployeeDetails();
}
}

Класс Сотрудник

class Employee
{
private int empId;
private int empSalary;
private string empName;
private int empAge;

public void SetEmployeeID(int id)
{
    empId = id; //Mutator
}

public void SetEmployeeSalary(int sal)
{
    empSalary = sal;  //Mutator
}

public int GetEmployeeID()
{
    return empId;  //Accessor
}

public int GetEmployeeSalary()
{
    return empSalary;  //Accessor
}

public string EmployeeName
{
    get { return empName; }   //Accessor
    set { empName = value; }  //Mutator
}

public int EmployeeAge
{
    get { return empAge; }  //Accessor
    set { empAge = value; } //Mutator
}

private void ShowDetails()
{
    HttpContext.Current.Response.Write(this.GetEmployeeID() + " : " + this.EmployeeName + " : " + this.EmployeeAge + " : " + this.GetEmployeeSalary());
}

public void ShowEmployeeDetails()
{
    ShowDetails();
}
}

Мое основное сомнение связано с тем, как я вызывал метод ShowDetails() в Employee. Это хороший способ скрыть метод ShowDetails()?

2 ответа

Решение

С точки зрения ОО, ваш метод ShowDetails делает две совершенно разные вещи.

  • Создание строки, которая представляет объект
  • Вывод строки в HttpResponse.

Теперь первая задача принадлежит классу Employee, вам нужно знать, что сотрудник должен иметь возможность создать строку, представляющую объект. На самом деле в.net это такая обычная вещь, на самом деле существует "переопределенная" или "виртуальная" функция с именем Object.ToString().

Вторая задача не имеет абсолютно никакого отношения к классу Employee, а МНОГО - к строкам и HttpResponses (и в этом случае, как мы получаем HttpResponse, то есть получаем его из HttpContext, что означает, что мы ДОЛЖНЫ быть на веб-сервере). в HttpRequest). При всех этих допущениях, это крайне небезопасно в универсальном классе "data" или "domain".

Вот как я бы рефакторинг это.

class Employee
{
    private int empId;
    private int empSalary;
    private string empName;
    private int empAge;

    public void SetEmployeeID(int id)
    {
        empId = id; //Mutator
    }

    public void SetEmployeeSalary(int sal)
    {
        empSalary = sal;  //Mutator
    }

    public int GetEmployeeID()
    {
        return empId;  //Accessor
    }

    public int GetEmployeeSalary()
    {
        return empSalary;  //Accessor
    }

    public string EmployeeName
    {
        get { return empName; }   //Accessor
        set { empName = value; }  //Mutator
    }

    public int EmployeeAge
    {
        get { return empAge; }  //Accessor
        set { empAge = value; } //Mutator
    }

    public override string ToString()
    {
        return this.GetEmployeeID() + " : " + 
            this.EmployeeName + " : " + 
            this.EmployeeAge + " : " + 
            this.GetEmployeeSalary();
    }


}

а также

public partial class _Default : System.Web.UI.Page
{
    Employee emp;

    protected void Page_Load(object sender, EventArgs e)
    {
        emp = new Employee();
        emp.SetEmployeeID(001);
        emp.SetEmployeeSalary(5000);
        emp.EmployeeName = "Rob";
        emp.EmployeeAge = 26;

        showBtn.Click += new EventHandler(showBtn_Click);
    }

    void showBtn_Click(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Write(emp.ToString());
    }
}

Так как мы точно знаем, что внутри веб-страницы есть действующий HttpContext.Current. Таким образом, сотрудникам не нужно знать об Интернете, и они также могут работать с приложением WinForm.

Я думаю, что ваше главное сомнение хорошее. Ваш объект сотрудника берет на себя обязанности, которыми он, вероятно, не должен владеть, как, например, запись в HttpContext. Если эта выходная строка является обычной, вы можете переопределить оператор ToString, найденный в.NET, удалить ShowDetails и добавить это по нажатию кнопки:

HttpContext.Current.Response.Write(emp.ToString())
Другие вопросы по тегам