В нем есть лекция по инкапсуляции. Преподаватель приводит пример того, как класс Rectangle может инкапсулировать как поля, так и методы:
Код: Выделить всё
class Rectangle
{
int _width;
int _height;
public Rectangle(int width, int height)
{
_width = width;
_height = height;
}
public int CalculateArea()
{
return _width * _height;
}
public int CalculateCircumference()
{
return _width * 2 + _height * 2;
}
}
Код: Выделить всё
_width
Код: Выделить всё
CalculateArea()
Код: Выделить всё
class Rectangle
{
public int Width;
public int Height;
public Rectangle(int width, int height)
{
Width = width;
Height = height;
}
}
class RectangleCalculator
{
public int CalculateArea(Rectangle rect)
{
return rect.Width * rect.Height;
}
public int CalculateCircumference(Rectangle rect)
{
return rect.Width * 2 + Rect.Height * 2;
}
}
Однако это заставило меня задуматься о Принцип единой ответственности и ее пример, кажется, противоречат ему. Разве хранение ширины и высоты прямоугольника не является другой обязанностью, чем вычисление его площади или окружности? Поэтому не лучше ли разделить эти обязанности на разные классы? Я спросил об этом у инструктора, и она сказала «нет», потому что ответственность класса Rectangle — представлять прямоугольник, а это может означать наличие методов для вычисления таких вещей, как площадь или окружность.
Это меня зацепило. думая, что я не знаю, что такое «ответственность». Конечно, вы могли бы сказать, что ответственность класса Rectangle — представлять прямоугольник, но это можно разделить на более мелкие обязанности (сохранение ширины и высоты, вычисление площади, вычисление окружностей и т. д.). Так как же нам определить правильный способ описания ответственности класса?
Роберт К. Мартин, автор принципа единой ответственности, формулирует его следующим образом: «У класса должна быть только одна причина изменять." Но предположим, что требуется внести изменение, чтобы класс Rectangle сохранял ширину и высоту в виде значений с плавающей запятой, а не в виде целых чисел:
Код: Выделить всё
class Rectangle
{
public float Width;
public float Height;
public Rectangle(float width, float height)
{
Width = width;
Height = height;
}
// more code
}
Код: Выделить всё
class Rectangle
{
public float Width;
public float Height;
public Color Color;
public Rectangle(float width, float height, Color color)
{
Width = width;
Height = height;
Color = color
}
// more code
}
Поэтому для меня вопрос о том, что такое «ответственность», возникает только отложил вопрос о том, что такое «причина для изменения». Может ли кто-нибудь пролить свет на это? Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/787 ... -principle