Quan ens trobem amb aquesta problemàtica: vegem la qualitat com a necessària però som incapaços de arribar al nivell que desitgem, hem de optar per una solució de compromís. Crec, puc estar molt equivocat, que l'opció més adient és identificar quin és el nucli crític de l'aplicació i mantenir-lo el més aïllat possible de la resta de l'aplicació.
Fins i tot, el millor seria fer que només certes persones fossin responsables d'aquesta part, però això ja pot ser més complicat. Podríem introduir el coll de botella que intentem evitar. Per això una solució més realista probablement sigui mantenir al manco l'aïllament.
I quina és aquesta part crítica?. En general aquesta part de l'aplicació correspondrà a les classes de domini i mètodes de servei més importat. No de tota l'aplicació, sinó aquelles que representen la part funcional bàsica del sistema.
No crec que aquesta intenció sigui estranya: ho feim amb altres parts de l'aplicació. Per exemple, si algú ha de crear un Servlet, el crea i ja està. Però si algú necessita una taula nova a la base de dades, normalment feim que necessiti l'aprovació d'algú amb coneixements específics o amb millor visió global de l'aplicació. Moltes vegades inclús es cerca un consens entre un ampli grup de desenvolupadors. No és que el Servlet no sigui important, però està clar que no està al mateix nivell que un canvi a l'esquema de la base de dades.
Aïllar aquesta zona de l'aplicació que reconeixem com a crítica permet que, encara que no puguem assolir al moment el nivell de qualitat dessitjada, més endavant sigui viable afrontar tasques de millora.
Per aconseguir aquest aïllament s'han d'evitar dues coses. Que el que ha d'estar allà dins surti, i que el que no ha d'estar allà dins hi entri. Així de fàcil. Així de difícil.
Per exemple, si feim un mètode de servei
public void modificaSolicitutVacancies (Solicitut nova);
Probablement aquesta funcionalitat inclou molts de casos diferents:
- La solicitut canvi l'estat a acceptada. És una acceptació d'una solicitut de vacances
- La solicitut canvi l'estat a rebutjada. És una denegació
- La solicitut activa un atribut de cancelada. L'usuari retira la solicitut. Si ja estava acceptada s'han de restaurar els dies de vacances restants
- ...
L'altre problema es pot produir pel fet que, mesclat amb aquesta part crítica, s'hi introdueixin altres components que no ho són tant.
Per exemple, el sistema anterior pot tenir un servei de notificació via email o sms de l'estat de les solicituts. Aquest clarament és un mòdul de suport a l'aplicació. Pot ser molt important per l'usuari. Fins i tot imprescindible, però no està al nucli del que implementem. Ha d'estar clarament diferenciat al codi.
El camí a seguir ha de ser tenir el màxim de funcionalitat possible treta de la gestió bàsica de l'aplicació. Quan més ens esforcem en aquesta tasca més parts de l'aplicació passaran a estar implementades amb eines externes en lloc de codi nostre. Coses com eines de reports, eines de cerca de documents o d'explotació de dades (uns companys ara fan virgueries amb el Pentaho), poden augmentar molt el profit que s'extreu de la nostra aplicació.
Però això només és possible si la base damunt la que se sustenta tota aquesta parafernàlia és sòlida. Si la creació i cerca de documents PDF generats està mesclat amb el nucli de l'aplicació, dificilment trobarem una eina que s'adapti al que necessitem. Si feim un mòdul separat amb el que té de comú tota la part de generació de documents, extreim aquesta part de la gestió bàsica (no mesclar el codi del mètode que determina que una solicitut s'ha d'acceptar amb el que genera el document d'acceptació) i ens adaptem a l'estructura habitual (general) de les eines de indexació i cerca de documents, tenim molts de números de poder delegar part important a una eina externa.