2010-01-18 33 views
5

Tôi đang phát triển CMS chủ yếu dựa trên các thành phần của khung công tác Zend. Một số các bảng cơ sở dữ liệu cho CMS này là như sau:Granularization của mô hình?

site 
| id | name | 
------------- 

locale 
| languageCode | regionCode | 
----------------------------- 

site_locale // link sites with locales 
| siteId | languageCode | regionCode | isActive | isDefault | 
------------------------------------------------------------- 

Tôi có một mô hình tên Site trong đó bao gồm, trong số những người khác, các phương pháp sau:

getId() 
getName() 
listLocales() // list all locales for this site 

tôi là loại trên hàng rào trên cách tôi đã định hình chi tiết các mô hình:

Một tùy chọn sẽ là trả về SiteLocale đối tượng/mô hình (nói cách khác là biểu diễn bảng DB) từ phương pháp listLocales(), trong đó các đối tượng này SiteLocale ntain các phương pháp sau:

getSite() // returns the Site model 
getLocale() // returns a Zend_Locale 
isActive() // is this locale active for the site this model represents? 
isDefault() // is this the default locale for the site this model represents() 

Các tùy chọn khác sẽ được chỉ đơn giản là tạo ra các phương pháp sau đây trong mô hình Site, và được thực hiện với nó:

getDefaultLocale() // simply return the default site locale as Zend_Locale 
listActiveLocales() // simply return all active site locales as Zend_Locales 
listAllLocales() // simply return all site locales as Zend_Locales 

Bạn cảm thấy gì là đúng cách để đi? Và tại sao?

Ngoài ra, tùy chọn đầu tiên (hoặc thậm chí cả hai tùy chọn) vi phạm Law of Demeter?

EDIT (ngày 22 tháng 1)
Mặc dù tôi thích Jeff's câu trả lời, Im vẫn mở cho mới/khác quan điểm.

Trả lời

3

Đầu tiên, liên quan đến các bảng cơ sở dữ liệu: Bạn có thể chuẩn hóa cơ sở dữ liệu hơn nữa. Có sự trùng lặp giữa bảng locale và site_locale. Tất nhiên, tôi không thấy bức tranh lớn ở đây nên có thể có thứ gì đó đằng sau cách bạn làm.

Thẳng thắn, một trong hai tùy chọn là tốt. Tôi sẽ chọn thiết kế giúp mã của bạn dễ đọc và dễ bảo trì hơn. Ví dụ, nếu bạn chọn tùy chọn đầu tiên, bạn sẽ kết thúc với các vòng như thế này trên khắp nơi?

site_locales = site.listLocales() 
foreach (site_locale in site_locales) { 
    if site_locale.isDefault() { 
     do_something(site_locale.getLocale()) 
    } 
} 

Nếu vậy, sau đó tôi muốn tránh nó và đi với tùy chọn thứ hai và kết thúc với:

do_something(site.getDefaultLocale()) 

Đây là nhiều hơn nữa dễ hiểu với một cái nhìn nhanh chóng. Có lẽ nó thậm chí còn cải thiện hiệu suất trang web của bạn.

Tuy nhiên, nếu bạn nghĩ bạn sẽ thực hiện rất nhiều công việc sử dụng danh sách SiteLocales trong tương lai, nhưng bạn không biết chính xác bạn sẽ làm gì ngoài getDefaultLocale(), listActiveLocales()listAllLocales(), thì có lẽ lựa chọn đầu tiên có thể là lý tưởng. Hoặc bạn thậm chí có thể sử dụng kết hợp cả hai.

Đối với Luật Demeter, nó giống như Hướng dẫn của Demeter. Bạn có thể vi phạm bất kỳ quy tắc nào miễn là bạn làm điều đó một cách có ý thức, hiểu tại sao bạn làm điều đó và hiểu hậu quả, nếu có. Ví dụ: nếu vi phạm luật dẫn đến mã dễ bảo trì hơn và dễ đọc hơn, nhưng bạn vẫn duy trì sự phân tách cao cấp về các mối quan ngại trong đơn đăng ký của mình, thông thường là OK. Vì vậy, tôi sẽ không lo lắng về việc liệu một trong hai tùy chọn có vi phạm luật hay không.

+0

Xin chào Jeff, cảm ơn bạn đã trả lời.Về sự trùng lặp, tôi đang sử dụng ràng buộc toàn vẹn tham chiếu (InnoDB) để mã ngôn ngữ và mã vùng là các khóa ngoại với các ràng buộc. Tôi thích kiểu này vì nó giúp bạn dễ dàng tìm nạp các hàng nhiều-nhiều mà không cần phải tham gia bảng ngôn ngữ. Nhưng tôi muốn có thể thêm các ngôn ngữ được tách riêng khỏi các trang web. Hy vọng điều này có ý nghĩa. Dù sao, tôi thấy những gì bạn đang nói. Tôi nghĩ rằng bạn đã thuyết phục tôi sử dụng cả hai tùy chọn, vì tôi sẽ sử dụng cả hai kịch bản mà bạn đã đề cập (đầu tiên trong giao diện người dùng, thứ hai trong phần phụ trợ quản trị). Cảm ơn vì đầu vào của bạn. –

+0

Cảm ơn Jeff lần nữa. Tôi sẽ có bánh của tôi và ăn nó. :) –

Các vấn đề liên quan