Lưu ý: Mẫu mã được viết bằng c #, nhưng điều đó không quan trọng. Tôi đã đặt c # làm thẻ vì tôi không thể tìm thấy thẻ nào phù hợp hơn. Đây là về cấu trúc mã.
Tôi đang đọc Clean Code và cố gắng trở thành một lập trình viên tốt hơn.
Tôi thường thấy mình phải vật lộn để tuân theo Nguyên tắc Trách nhiệm Đơn lẻ (các lớp và chức năng chỉ nên làm một việc), đặc biệt trong các chức năng. Có lẽ vấn đề của tôi là "một điều" không được xác định rõ, nhưng vẫn ...
Một ví dụ: Tôi có một danh sách Fluffies trong cơ sở dữ liệu. Chúng tôi không quan tâm Fluffy là gì. Tôi muốn một lớp học để phục hồi lông tơ. Tuy nhiên, lông tơ có thể thay đổi theo một số logic. Tùy thuộc vào một số logic, lớp này sẽ trả về dữ liệu từ bộ đệm hoặc nhận mới nhất từ cơ sở dữ liệu. Chúng ta có thể nói rằng nó quản lý lông tơ, và đó là một điều. Để làm cho nó đơn giản, giả sử dữ liệu được tải là tốt trong một giờ, và sau đó nó phải được tải lại.
class FluffiesManager
{
private Fluffies m_Cache;
private DateTime m_NextReload = DateTime.MinValue;
// ...
public Fluffies GetFluffies()
{
if (NeedsReload())
LoadFluffies();
return m_Cache;
}
private NeedsReload()
{
return (m_NextReload < DateTime.Now);
}
private void LoadFluffies()
{
GetFluffiesFromDb();
UpdateNextLoad();
}
private void UpdateNextLoad()
{
m_NextReload = DatTime.Now + TimeSpan.FromHours(1);
}
// ...
}
GetFluffies()
có vẻ ổn với tôi Người dùng yêu cầu một số lông tơ, chúng tôi cung cấp cho họ. Sẽ phục hồi chúng từ DB nếu cần, nhưng đó có thể được coi là một phần của việc lấy lông tơ (tất nhiên, điều đó hơi chủ quan).
NeedsReload()
có vẻ đúng Kiểm tra nếu chúng ta cần tải lại lông tơ. UpdateNextLoad vẫn ổn. Cập nhật thời gian cho lần tải lại tiếp theo. Đó chắc chắn là một điều duy nhất.
Tuy nhiên, tôi cảm thấy những gì LoadFluffies()
không thể được mô tả là một điều duy nhất. Nó nhận dữ liệu từ Cơ sở dữ liệu và lên lịch tải lại lần tiếp theo. Thật khó để tranh luận rằng việc tính toán thời gian cho lần tải lại tiếp theo là một phần của việc lấy dữ liệu. Tuy nhiên, tôi không thể tìm ra cách nào tốt hơn để làm điều đó (đổi tên hàm thành LoadFluffiesAndScheduleNextLoad
có thể tốt hơn, nhưng nó chỉ làm cho vấn đề rõ ràng hơn).
Có một giải pháp tao nhã để thực sự viết lớp này theo SRP không? Có phải tôi đang quá tầm phào?
Hoặc có lẽ lớp học của tôi không thực sự chỉ làm một điều?
DateTime.UtcNow
để bạn tránh thay đổi tiết kiệm ánh sáng ban ngày hoặc thậm chí thay đổi múi giờ hiện tại.