2010-01-18 9 views
5

Estoy desarrollando un CMS basado principalmente en los componentes de Zend Framework. Algunas de las tablas de la base de este CMS son como sigue:Granularización de modelos?

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

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

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

Tengo un modelo llamado Site que consiste, entre otros, de los siguientes métodos:

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

Estoy un poco en el valla en la forma granularized debería definir modelos:

una opción sería volver SiteLocale objetos/modelos (en otras palabras, una representación de la tabla DB) desde el método listLocales(), donde estos objetos SiteLocale co ntain los métodos siguientes:

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() 

La otra opción sería crear simplemente los métodos siguientes en el modelo Site, y puede hacer con ella:

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 

¿Cuáles cree que es la forma correcta de ¿ir? ¿Y por qué?

Además, ¿la primera opción (o incluso ambas opciones) violaría el Law of Demeter?

EDITAR (22 de enero)
Aunque me gusta Jeff's respuesta, Im sigue abierta para nuevos/otras perspectivas.

Respuesta

3

Primero, con respecto a las tablas de la base de datos: Probablemente pueda normalizar la base de datos aún más. Hay una duplicación entre las tablas locale y site_locale. Por supuesto, no veo el panorama general aquí, así que podría haber algo detrás de la forma en que lo hiciste.

Francamente, cualquier opción está bien. Elegiría el diseño que hace que tu código sea más legible y mantenible. Por ejemplo, si elige la primera opción, ¿terminaría con bucles como este en todas partes?

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

Si es así, entonces yo evitaría él e ir con la segunda opción y terminan con:

do_something(site.getDefaultLocale()) 

Esto es mucho más comprensible con una mirada rápida. Tal vez incluso mejoraría el rendimiento de su sitio.

Sin embargo, si usted cree que va a hacer un montón de trabajo que utiliza listas de SiteLocales en el futuro, pero no se sabe exactamente lo que va a hacer más allá de getDefaultLocale(), listActiveLocales() y listAllLocales(), entonces quizás la primera opción podría ser ideal. O incluso podrías usar una combinación de los dos.

En cuanto a la Ley de Demeter, es más como la Guía de Demeter. Está bien romper cualquier regla siempre que lo haga conscientemente, entender por qué lo hace y comprender las consecuencias, si las hay. Por ejemplo, si infringir la ley conduce a un código más fácil de mantener y legible, pero aún conserva una separación de alto nivel de inquietudes en su aplicación, generalmente está bien. Entonces no me preocuparía si una opción viola la ley o no.

+0

Hola Jeff, gracias por tu respuesta.Acerca de la duplicación, estoy usando restricciones de integridad referencial (InnoDB) por lo que el código de idioma y el código de región son claves foráneas con restricciones. Me gusta este estilo ya que hace que sea fácil buscar el conjunto de filas de muchos a muchos sin tener que unirme a la tabla de configuración regional. Pero sí quiero poder agregar configuraciones regionales desacopladas de los sitios. Espero que esto tenga sentido. De todos modos, veo lo que estás diciendo. Creo que me convenciste de usar ambas opciones, ya que utilizaré los dos escenarios que mencionaste (primero en la interfaz, segundo en el administrador). Gracias por tu contribución. –

+0

Gracias de nuevo Jeff. Voy a tener mi pastel y comerlo también. :) –