Interfacek es konstansok
Sziasztok!
Kicsi OOP-s fejtores kovetkezik. Adott a kovetkezo minta kod:A cel itt az, hogy barki implementalhasson egy masik Database szolgaltatast sok erolkodes nelkul. A jelenlegi konstrukcioban viszont semmi trivialisan nem mutatja azt egy implementalonak, hogy egy masik (uj) szolgaltatasnal kellene biztositani egy
Ki hogy oldana ezt meg?
■ Kicsi OOP-s fejtores kovetkezik. Adott a kovetkezo minta kod:
abstract class AbstractService {
public function getName() {
return static::SERVICE_NAME;
}
}
interface iDatabaseService {
const SERVICE_NAME='database';
}
class DatabaseService extends AbstractService implements iDatabaseService {
}
SERVICE_NAME
konstanst.Ki hogy oldana ezt meg?
Kivétel
getName
metódusban, ami erre utal. Ez eléggé egyértelművé tenné, hogy mit is kellene implementálni.Miert kell a konstans? Az
Konstans
"Enum"?
Mindez arra kéne, hogy egyedi
Egyébként az interfészbe ha felveszed a
Igen
Szerintem a statikus függvény
Nem
Szerintem rossz helyen van az
Akkor nem értem. Azt hittem
Pelda
Service/ServiceRegistry.php
Itt kéne átírni szerintem, hogy névvel lehessen regisztrálni service-t, és ne maga a service tartalmazza a saját nevét. Esetleg a registry injektáljon neki uniqueId-t, ha a név nem fontos. De ez az én véleményem... Érdemes lenne megnézni, hogy mások hogy csinálják.
Nem fontos
Tudsz mutatni egy példát erre
Nézegettem a config fájlt, nekem úgy néz ki, hogy semmi akadálya, hogy onnan adj nevet az egyes service-eknek... Nem teljesen tiszta, hogy ezekkel kapcsolatban mi a specifikáció, egy service osztály csak egyszer kerülhet példányosításra, vagy csak egy adatbázis típusú service lehet a rendszerben, stb... Írnál erről valamit?
pl
Oks, este megnézem.
Nem akarom lerántani az
Szerintem teljesen jó megoldás erre a problémára, ha a config-ban megadod a Service nevét mondjuk egy id attribútummal, ami ugye egyedi, vagy a dtd-ben megadod, hogy unique legyen az attribútum, amit erre használsz. (Nem vagyok benne biztos, hogy ezt dtd-vel lehet, keveset foglalkoztam dtd-vel, valamivel többet xsd-vel, a helyedben inkább ez utóbbit használnám, ha van rá lehetőség, mert sokkal könnyebb vele az élet).
Ha bármilyen megkötésed van a Service típusokkal kapcsolatban - pl: egy bizonyos interface-t csak egy regisztrált Service implementálhat - akkor azt a ServiceRegistry átírásával meg tudod csinálni. Ha interface alapján akarnál lekérni egy bizonyos Service-t, az ugyanígy megoldható. Mindkettő zűrös karbantarthatóság szempontjából, mert az azonosító stringeket kézzel kell átírni, ha bármi változik. Tudtommal nincs erre igazán jó megoldás. Az autocomplete-t úgy lehet mégis bekapcsolva tartani, ha a Service elkérése után átadod egy setternek a Service-t, amin be van állítva, hogy annak milyen interface-t kell implementálnia. Nyilván emiatt a Service elkérője is egy IoC container lesz, mert ő is példányosít valamit, amin egy setter-t hív meg. Tehát elvileg a Service neveket csak alsóbb absztrakciós szintű - egy-egy modulhoz tartozó - IoC containerek tudhatják. Nem akarom továbbgondolni ezt a kelleténél, én sem hiszem, hogy tudom a tökéletes rendszer titkát, csak próbálkozom egy ideje - több-kevesebb sikerrel - valami olyat csinálni, ami megfelel a SOLID elveknek...
Nem világos, mi a célod
Laza kapcsolat
Az világos (és nagyon
Szvsz sérti az SRP-t és az
Pedig az enum lesz a jó, ahogy már írták is
Absztrakt
A hobby?
Én a helyedben a registry-t
A jelenlegi tapasztalataimmal
Erre PHP-ben az egyik lehetséges eszköz a doctrine common-ben lévő annotations modul.
Van még egy tutorial jellegű leírás is hozzá. Meg természetesen van hozzá kód is: doctrine/common. Azért a common-t ajánlom, mert abban van pár alap driver még pluszban, amik segítenek annotációkat feldolgozni.
Itt van egy rövid leírás az általában használt annotációs tervezési mintákról: annotation-based-design-patterns.
Egyelőre még én is kísérletezek egy annotációkat használó rendszerrel, de az eddigiek alapján sokkal jobb, mint bármi más ilyen téren, beleértve a config fájlokat is. Nem tudom te hogy bírod, de nekem nagyon elegem van a string-ként config fájlban megadott osztálynevekből, meg hasonlókból. Elég rosszul refaktorálható az ilyesmi...
Csak hogy idézzek a
Service locator
Typical software product consists of modules or services. Components should be able to find other services that provide required functionality. Service as well as tag pattern may be defined as a class that implements specific interface. But contrary to tag interface service interface declares methods.
Before annotations were invented frameworks could locate service if it implemented required interface. This method does not allow distinguishing between two different implementations of the same interface. Annotations allow this. For example Service annotation of Spring Framework can hold service name:
Not only class but also separate method can be a service. For example, each test in the test case is "service" that validates specific testing scenario. Particular test is labeled with annotation @Test and framework can find it.
More complicated example of service pattern is @RequestMapping of Spring MVC. This annotation supports several attributes that help the framework to choose suitable services according to HTTP request parameters. Both classes and methods can be annotated with @RequestMapping.
én is kívülre tenném az
csak arra gondolj, hogy mi van ha két adatbázishoz szeretnél csatlakozni.. ezzel a megoldással annyi, hogy két sor lesz a configban db1 és db2 pl.
már ha jól értettem, hogy mit szeretnél.