我的 TODO APP 解决方案是否与 OOP 一致?
My TODO APP solutions is consistent with OOP?
我想通过对 TODO 列表应用程序的这两个实现的贡献来了解您对面向对象编程原则的看法。
方案一:通过TodoListRepository获取对应的todoList对象,通过获取对象添加TodoItem
class TodoItem{
private readonly string _libele;
private readonly int _todoListId;
public string Libele => _libele;
public TodoItem(int todoListId, string libele)
{
_libele = libele;
_todoListId = todoListId;
}
}
class TodoList{
private readonly ICollection<TodoItem> _items;
private readonly int _id;
public IReadOnlyList<TodoItem> Items => _items.ToList();
public void AddItem(string libele)
{
_items.Add(new TodoItem(_id, libele));
}
}
class TodoListService {
private readonly ITodoListRepository _repository;
private readonly IAppUnitOfWork _unitOfWork;
public TodoListService(ITodoListRepository repository, IAppUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
_repository = repository;
}
void AddItemToTodoList(int todoListId, string lebele)
{
var todList = _repository.GetTodoListById(todoListId);
todList.AddItem(lebele);
_unitOfWork.Commit();
}
}
解决方案 2 通过 TodoItemRepository 添加 todoItem 而不通过 TodoList 对象
class TodoItem {
private readonly string _libele;
private readonly int _todoListId;
public string Libele => _libele;
public TodoItem(int todoListId, string libele)
{
_libele = libele;
_todoListId = todoListId;
}
}
class TodoList{
private readonly ICollection<TodoItem> _items;
private readonly int _id;
public IReadOnlyList<TodoItem> Items => _items.ToList();
}
class TodoItemService {
private readonly ITodoItemRepository _repository;
private readonly IAppUnitOfWork _unitOfWork;
public TodoItemService(ITodoItemRepository repository, IAppUnitOfWork unitOfWork){
_unitOfWork = unitOfWork;
_repository = repository;
}
void AddItemToTodoList(int todoListId, string lebele){
var todoItem = new TodoItem(todoListId, lebele);
_repository.Add(todoItem);
_unitOfWork.Commit();
}
}
方案1是否符合OOP。两种解决方案之间的意见是什么?提前致谢
您的 类 TodoItem
和 TodoList
相当简单,只有一项责任 (Single responsibility Principle)。
而这些 类 没有任何代码可以污染他们的单一职责。我的意思是在这些 类 中没有日志记录或其他职责的逻辑。所以没关系。
但是您在解决方案 1 中的代码似乎不会保存任何项目,因为您的项目将被添加到 IReadOnlyList<TodoItem> Items
。
我喜欢这个存储库具有很好的关注点分离。我的意思是 repository
在这里就像简单的项目集合。我们可以用List<T>
类比,即
List<T>
没有 Save()
方法。保存项目的责任委托给 _unitOfWork
。这也是很好的关注点分离。
void AddItemToTodoList(int todoListId, string lebele)
{
var todoItem = new TodoItem(todoListId, lebele);
_repository.Add(todoItem);
_unitOfWork.Commit();
}
我想通过对 TODO 列表应用程序的这两个实现的贡献来了解您对面向对象编程原则的看法。
方案一:通过TodoListRepository获取对应的todoList对象,通过获取对象添加TodoItem
class TodoItem{
private readonly string _libele;
private readonly int _todoListId;
public string Libele => _libele;
public TodoItem(int todoListId, string libele)
{
_libele = libele;
_todoListId = todoListId;
}
}
class TodoList{
private readonly ICollection<TodoItem> _items;
private readonly int _id;
public IReadOnlyList<TodoItem> Items => _items.ToList();
public void AddItem(string libele)
{
_items.Add(new TodoItem(_id, libele));
}
}
class TodoListService {
private readonly ITodoListRepository _repository;
private readonly IAppUnitOfWork _unitOfWork;
public TodoListService(ITodoListRepository repository, IAppUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
_repository = repository;
}
void AddItemToTodoList(int todoListId, string lebele)
{
var todList = _repository.GetTodoListById(todoListId);
todList.AddItem(lebele);
_unitOfWork.Commit();
}
}
解决方案 2 通过 TodoItemRepository 添加 todoItem 而不通过 TodoList 对象
class TodoItem {
private readonly string _libele;
private readonly int _todoListId;
public string Libele => _libele;
public TodoItem(int todoListId, string libele)
{
_libele = libele;
_todoListId = todoListId;
}
}
class TodoList{
private readonly ICollection<TodoItem> _items;
private readonly int _id;
public IReadOnlyList<TodoItem> Items => _items.ToList();
}
class TodoItemService {
private readonly ITodoItemRepository _repository;
private readonly IAppUnitOfWork _unitOfWork;
public TodoItemService(ITodoItemRepository repository, IAppUnitOfWork unitOfWork){
_unitOfWork = unitOfWork;
_repository = repository;
}
void AddItemToTodoList(int todoListId, string lebele){
var todoItem = new TodoItem(todoListId, lebele);
_repository.Add(todoItem);
_unitOfWork.Commit();
}
}
方案1是否符合OOP。两种解决方案之间的意见是什么?提前致谢
您的 类 TodoItem
和 TodoList
相当简单,只有一项责任 (Single responsibility Principle)。
而这些 类 没有任何代码可以污染他们的单一职责。我的意思是在这些 类 中没有日志记录或其他职责的逻辑。所以没关系。
但是您在解决方案 1 中的代码似乎不会保存任何项目,因为您的项目将被添加到 IReadOnlyList<TodoItem> Items
。
我喜欢这个存储库具有很好的关注点分离。我的意思是 repository
在这里就像简单的项目集合。我们可以用List<T>
类比,即
List<T>
没有 Save()
方法。保存项目的责任委托给 _unitOfWork
。这也是很好的关注点分离。
void AddItemToTodoList(int todoListId, string lebele)
{
var todoItem = new TodoItem(todoListId, lebele);
_repository.Add(todoItem);
_unitOfWork.Commit();
}