Это очень странный пример, потому что SetGrid, похоже, не делает ничего, кроме установки некоторых значений по умолчанию. Вы также позволяете коду выполнять манипуляции с объектом, который вполне может сделать это сам по себе. Значение IGrid
и ProjectModel
может быть изменено следующим образом:
public interface IGrid {
// ...
public void setDefaults();
// ...
}
public class ProjectModel : IGrid {
// ...
public void setDefaults() {
PagerHelper.SetPage(1, 10);
SortHelper.SetSort(SortOperator.Ascending);
PagerHelper.RecordsPerPage = 10;
}
// ...
}
При использовании этого рефакторинга вам нужно всего лишь выполнить то же самое с:
myProjectModel.setDefaults();
Вы также можете создать абстрактный базовый класс , который реализует IGrid
, который реализует метод setDefaults()
и позволяет ProjectModel
расширять абстрактный класс.
как насчет принципов SOLID? Конкретно Принцип Единой Ответственности. Во-первых, класс - это что-то вроде DTO. - user137348
Я применяю принцип разделения интерфейса из принципов SOLID, чтобы скрыть реализацию от клиента класса. То есть таким образом, клиент не должен иметь доступ к внутренним компонентам класса, который он использует, иначе это нарушение Принцип наименьшего знания .
Принцип единой ответственности (SRP) говорит только о том, что у класса должна быть только одна причина для изменения, что является очень смутным ограничением, поскольку изменение может быть настолько узкий и широкий, насколько вы хотите.
Полагаю, можно добавить некоторую логику конфигурации в класс параметров, если он достаточно мал. В противном случае я бы поставил все это на фабричный класс. Причина, по которой я предлагаю это решение, заключается в том, что IGrid
, кажется, имеет ссылку на PagerHelper
и SortHelper
, которые кажутся мутаторами для IGrid
.
Поэтому я нахожу странным, что вы упомянули, что класс DTO . У DTO с точки зрения пуристов не должно быть логики, кроме аксессоров (то есть методов получения), что делает странным то, что сам по себе ProjectModel
имеет ссылки на PagerHelper
и SortHelper
, которые, как я полагаю, могут его мутировать (т.е. они ' сеттеры). Если вы действительно хотите SRP, «помощники» должны быть в фабричном классе, который создает экземпляр IGrid
/ ProjectModel
.