Quote (CyberPunk666 @ 6 Nov 2014 22:00)
btw hogy lehet megtanulni jól tervezni oop programokat?
máté segítsen
Single responsibility principle
a class should have only a single responsibility (i.e. only one potential change in the software's specification should be able to affect the specification of the class)
Open/closed principle
“software entities … should be open for extension, but closed for modification.”
Liskov substitution principle
“objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.” See also <design by contract>.
Interface segregation principle
“many client-specific interfaces are better than one general-purpose interface.”[8]
Dependency inversion principle
one should “Depend upon Abstractions. Do not depend upon concretions.”[8]
Dependency injection is one method of following this principle.
mindegyikre vannak remek példák és első körben úgy lazán 2 hetet el lehet tölteni velük
főleg ha valaki programozott OOP-ben
ezek közül a D a legtágabb szerintem
A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
B. Abstractions should not depend on details. Details should depend on abstractions.ez is újragondoltat pár dolgot, és nem összetéveszendő a Dependency Injection-el
valamint adott az Inversion of Control fogalma, ami egy az egyben a rendszer modularitását hivatott növelni, "kifordít dolgokat" by definition
van egy ILogger osztályod, nem mondod meg hogy mibe logoljon (txt fájl, sql, akármi) hanem azt mondod hogy ő elvár egy ILogImplementation osztályt, aminek van Log(string s) cucca, és mi ezt hívjuk meg, anélkül hogy tudnánk mi történik belül
és mikor logolnánk, ILoggeren keresztül tesszük de ezen az absztrakción nem tudjuk hogy mi történik a valóságban
aztán persze az Inversion of Control absztrakt fogalom egyik megvalósítása a Dependency Injection, ami adja is magát
ILogger(ILogImplementation logImplementation) ugye amit hívunk és akkor
ILogger(xmlLogImplementation) formájában injektálod a függőségét
így szétszedtük a rendszer részeit
nem lehet teljesen szétszedni mindent
vannak IoC containerek (ez már framework szintű dolog), amik azt csinálják hogy
Code
/// <summary>
/// Initializes the Inversion of Control container, and registers the known interfaces to their corresponding implementation.
/// </summary>
public static class ContainerBuilder
{
/// <summary>
/// Builds this instance.
/// </summary>
public static void Build()
{
var container = new Container();
container
.RegisterSingleton<IAssemblyInfoProvider, AssemblyInfoProvider>()
.RegisterSingleton<IExtensionManager, ExtensionManager>()
.RegisterSingleton<ILogStream, LogStream>()
.RegisterSingleton<ILogger, Logger>()
.RegisterTransient<IEvaluator, Evaluator>()
.RegisterSingleton<IPrefixNotationBuilder, PrefixNotationBuilder>()
...
puff, azt mondtuk hogy jó, én interfaceket használok, az 500.000 soros appomban még sincs egy referencia sem magukra az implementációkra, és semmi sem függ tőlük
ettől kezdve, hogy beírtam ezt egy containerbe, minden alkalommal amikor egy class-t készítek, a container végigmegy Reflection-el a classeken és injektálja a regisztrált xy élettartamú osztályainkat (transient = mindig újat kapsz ha kérsz, singleton = ...)
-> még singleton classeket sem kell írnunk, mert NORMÁLISAN írjuk meg őket, és a container gondoskodik róla
meg persze unit tesztelni sem lehet singleton osztályt, de ez már a deep shit kategóriája
most annyi keyword-öt írtam le hogy ebből 6 hónapig tudsz guglizni meg példákat nézni
ja persze és ez sem készpénz, mert néha akarsz írni BaseClassek-et mert az fasza code-reuse és akkor az egész "minden interface" dolgot agyonbasszák