SlideShare a Scribd company logo
Tomáš Vichta 18. března 2017
SOLID principy v OOP návrhu
2
SOLID principy
S ingle-responsiblity
O pen-closed
L iskov substitution
I nterface segregation
D ependency inversion
3
Proč SOLID?
› Snadnější a bezpečnější rozšiřitelnost
› Přehlednost
› Znovupoužívání kódu
– Jednotné chování aplikace
› Lépe testovatelný kód
– unit testy i mocky pro testovací prostředí
› Méně bugů
4
Single Responsibility Principle
› 1 třída má 1 zodpovědnost
› Není dobré jít do extrému (třídy s 1 řádkem kódu)
› Ale když váhám, tak kód raději hned rozdělím na více tříd
SINGLE RESPONSIBILITY PRINCIPLE
Just Because You Can, Doesn't Mean You Should
5
Single Responsibility Principle
class BigClass
{
public void Load() { }
public void Compute() { }
}
class Loader
{
public void Load() { }
}
class Calculator
{
public void Compute() {
}
}
6
Dependency Inversion Principle
› Třída má záviset na abstrakci
– Interface, base (často abstract) class
› Tzn. implementaci dodáme třídě zvenku
– Constructor, Property, Method Injection
› Souvisí s Inversion of Control/Dependency Injection
1
2
3
1
2
3
7
Dependency Inversion Principle – příklad
class BetterComputeController
{
private readonly ICalculator _calc;
public IMailer Mailer { get; set; }
public BetterComputeController(ICalculator calc) { _calc = calc; }
public void Process(object model)
{
_calc.Compute();
Mailer?.Send("computed successfully");
}
}
class BadComputeController
{
public void Process(object model)
{
new Calculator().Compute();
if (true)
new Mailer().Send("computed successfully");
}
}
8
Open-closed Principle
› Nová funkcionalita se přidává novým kódem, nikoli modifikací
starého
› Open
– Nová funkcionalita = nová třída
• Děděním
• Novou implementací stávajících interfaces
› Closed
– Nesahám do stávajících tříd
› Netýká se bugfixingu, refaktoringu, většinou ani změn
9
Open-closed Principle – příklad
10
Liskov substitution Principle
› Subclass se chová navenek stejně jako base class
› Rozšiřuje Open-closed princip
› Metody v Subclass
– Nevyhazovat žádné nové výjimky (kromě poděděných), protože
s nimi klient nemusí počítat.
– Nesmí vyžadovat větší omezení na vstupní argumenty
– "Postconditions cannot be weakened in a subtype."
› Neměnit vnější stav, pokud to klient nečeká
› Typický příklad
– čtverec vs. obdélník a metody SetWidth(), SetHeight(), ComputeArea()
11
Liskov substitution Principle – příklad
class Liskov
«interface»
ISettingStore
+ Read(string): string
«interface»
IWritableSettingStore
+ Clear(): void
SettingManager
+ ClearAll(): void
+ GetColors(): IEnumerable<string>
+ SettingManager(ISettingStore[], IWritableSettingStore[])
InMemorySetting
+ Clear(): void
+ Read(string): string
DefaultConstantSettings
+ Read(string): string
-_settings
-_writableSettings
12
Interface Segregation Principle
› Každá funkcionalita má svůj, co nejmenší interface
› Klient: Používám interface/třídu
– jsou tam jen metody, které potřebuji
› Implementuji interface
– ten by neměl mít metody, které v mojí implementaci nemají smysl
– tj. nepotřebuji NotSupportedException jako jediný řádek metody
› Souvisí se Single Responsibility z pohledu konzumenta (klienta)
– Ale není to to samé, je legitimní dělit 1 responsibility do více interfaces
13
Interface Segregation Principle – příklad
interface IRepository
{
object Read();
void Save(object data);
}
class BadRepository : IRepository
{
public object Read() { return null; }
public void Save(object data) { }
}
interface IReader { object Read(); }
interface IWriter { void Save(object data); }
interface IRepository : IReader, IWriter{}
class BetterRepository : IReader, IWriter, IRepository
{
public object Read() { return null; }
public void Save(object data) { }
}
14
Interface Segregation Principle – příklad
public struct Int32 : IComparable, IFormattable, IConvertible
public abstract class Controller : ControllerBase,
IActionFilter, IAuthorizationFilter, IDisposable,
IExceptionFilter, IResultFilter, IAsyncController, IController,
IAsyncManagerContainer
15
Jak poznat non-SOLID kód?
› Varovné znaky
– Mnoho velkých if, velký počet if ve třídě
– typeof(Subclass)
– if(x is Subclass)
– Přetypování: var concreteObject = (Subclass)someObject
– Mnoho public metod, mnoho metod v interface
– Potřeba implementovat metody vyhozením
• .NET: NotSupportedException
• Java: UnsupportedOperationException
– Lze špatně nebo vůbec testovat
16
Diskuze
Profinit EU, s.r.o.
Tychonova 2, 160 00 Praha 6
Telefon
+ 420 224 316 016
Web
www.profinit.eu
LinkedIn
linkedin.com/company/profinit
Twitter
twitter.com/Profinit_EU
Děkujeme
za pozornost

More Related Content

More from Profinit

Reference Data Management
Reference Data ManagementReference Data Management
Reference Data Management
Profinit
 
Cloud in examples—(how to) benefit from modern technologies in the cloud
Cloud in examples—(how to) benefit from modern technologies in the cloudCloud in examples—(how to) benefit from modern technologies in the cloud
Cloud in examples—(how to) benefit from modern technologies in the cloud
Profinit
 
Building big data pipelines—lessons learned
Building big data pipelines—lessons learnedBuilding big data pipelines—lessons learned
Building big data pipelines—lessons learned
Profinit
 
Understand your data dependencies – Key enabler to efficient modernisation
 Understand your data dependencies – Key enabler to efficient modernisation  Understand your data dependencies – Key enabler to efficient modernisation
Understand your data dependencies – Key enabler to efficient modernisation
Profinit
 
Propensity Modelling for Banks
Propensity Modelling for BanksPropensity Modelling for Banks
Propensity Modelling for Banks
Profinit
 
Legacy systems modernisation
Legacy systems modernisationLegacy systems modernisation
Legacy systems modernisation
Profinit
 
Automating Data Lakes, Data Warehouses and Data Stores
Automating Data Lakes, Data Warehouses and Data StoresAutomating Data Lakes, Data Warehouses and Data Stores
Automating Data Lakes, Data Warehouses and Data Stores
Profinit
 
4 Steps Towards Data Transparency
4 Steps Towards Data Transparency4 Steps Towards Data Transparency
4 Steps Towards Data Transparency
Profinit
 
Software systems modernisation
Software systems modernisationSoftware systems modernisation
Software systems modernisation
Profinit
 
Odborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileOdborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum Mobile
Profinit
 
Data Science a MLOps v prostředí cloudu
Data Science a MLOps v prostředí clouduData Science a MLOps v prostředí cloudu
Data Science a MLOps v prostředí cloudu
Profinit
 
Detekce sociálních vazeb: domácnosti a přátelé
Detekce sociálních vazeb: domácnosti a přáteléDetekce sociálních vazeb: domácnosti a přátelé
Detekce sociálních vazeb: domácnosti a přátelé
Profinit
 
Výsledky backtestu propensitního modelu
Výsledky backtestu propensitního modeluVýsledky backtestu propensitního modelu
Výsledky backtestu propensitního modelu
Profinit
 
Propensitní modelování
Propensitní modelováníPropensitní modelování
Propensitní modelování
Profinit
 
Profinit Webinar: Benefits of Software Systems Modernization over their Repla...
Profinit Webinar: Benefits of Software Systems Modernization over their Repla...Profinit Webinar: Benefits of Software Systems Modernization over their Repla...
Profinit Webinar: Benefits of Software Systems Modernization over their Repla...
Profinit
 
Profinit webinar: Instalment Detector
Profinit webinar: Instalment DetectorProfinit webinar: Instalment Detector
Profinit webinar: Instalment Detector
Profinit
 
Profinit_snidane_DWH_22_10_2019_publish
Profinit_snidane_DWH_22_10_2019_publishProfinit_snidane_DWH_22_10_2019_publish
Profinit_snidane_DWH_22_10_2019_publish
Profinit
 
2019 09-23-snidane qa-public
2019 09-23-snidane qa-public2019 09-23-snidane qa-public
2019 09-23-snidane qa-public
Profinit
 
2019 03-20 snidane-serie-kuchyne-full
2019 03-20 snidane-serie-kuchyne-full2019 03-20 snidane-serie-kuchyne-full
2019 03-20 snidane-serie-kuchyne-full
Profinit
 
2018 11-28 snidane-serie-kuchyne
2018 11-28 snidane-serie-kuchyne2018 11-28 snidane-serie-kuchyne
2018 11-28 snidane-serie-kuchyne
Profinit
 

More from Profinit (20)

Reference Data Management
Reference Data ManagementReference Data Management
Reference Data Management
 
Cloud in examples—(how to) benefit from modern technologies in the cloud
Cloud in examples—(how to) benefit from modern technologies in the cloudCloud in examples—(how to) benefit from modern technologies in the cloud
Cloud in examples—(how to) benefit from modern technologies in the cloud
 
Building big data pipelines—lessons learned
Building big data pipelines—lessons learnedBuilding big data pipelines—lessons learned
Building big data pipelines—lessons learned
 
Understand your data dependencies – Key enabler to efficient modernisation
 Understand your data dependencies – Key enabler to efficient modernisation  Understand your data dependencies – Key enabler to efficient modernisation
Understand your data dependencies – Key enabler to efficient modernisation
 
Propensity Modelling for Banks
Propensity Modelling for BanksPropensity Modelling for Banks
Propensity Modelling for Banks
 
Legacy systems modernisation
Legacy systems modernisationLegacy systems modernisation
Legacy systems modernisation
 
Automating Data Lakes, Data Warehouses and Data Stores
Automating Data Lakes, Data Warehouses and Data StoresAutomating Data Lakes, Data Warehouses and Data Stores
Automating Data Lakes, Data Warehouses and Data Stores
 
4 Steps Towards Data Transparency
4 Steps Towards Data Transparency4 Steps Towards Data Transparency
4 Steps Towards Data Transparency
 
Software systems modernisation
Software systems modernisationSoftware systems modernisation
Software systems modernisation
 
Odborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileOdborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum Mobile
 
Data Science a MLOps v prostředí cloudu
Data Science a MLOps v prostředí clouduData Science a MLOps v prostředí cloudu
Data Science a MLOps v prostředí cloudu
 
Detekce sociálních vazeb: domácnosti a přátelé
Detekce sociálních vazeb: domácnosti a přáteléDetekce sociálních vazeb: domácnosti a přátelé
Detekce sociálních vazeb: domácnosti a přátelé
 
Výsledky backtestu propensitního modelu
Výsledky backtestu propensitního modeluVýsledky backtestu propensitního modelu
Výsledky backtestu propensitního modelu
 
Propensitní modelování
Propensitní modelováníPropensitní modelování
Propensitní modelování
 
Profinit Webinar: Benefits of Software Systems Modernization over their Repla...
Profinit Webinar: Benefits of Software Systems Modernization over their Repla...Profinit Webinar: Benefits of Software Systems Modernization over their Repla...
Profinit Webinar: Benefits of Software Systems Modernization over their Repla...
 
Profinit webinar: Instalment Detector
Profinit webinar: Instalment DetectorProfinit webinar: Instalment Detector
Profinit webinar: Instalment Detector
 
Profinit_snidane_DWH_22_10_2019_publish
Profinit_snidane_DWH_22_10_2019_publishProfinit_snidane_DWH_22_10_2019_publish
Profinit_snidane_DWH_22_10_2019_publish
 
2019 09-23-snidane qa-public
2019 09-23-snidane qa-public2019 09-23-snidane qa-public
2019 09-23-snidane qa-public
 
2019 03-20 snidane-serie-kuchyne-full
2019 03-20 snidane-serie-kuchyne-full2019 03-20 snidane-serie-kuchyne-full
2019 03-20 snidane-serie-kuchyne-full
 
2018 11-28 snidane-serie-kuchyne
2018 11-28 snidane-serie-kuchyne2018 11-28 snidane-serie-kuchyne
2018 11-28 snidane-serie-kuchyne
 

Solid principy v oop návrhu

  • 1. Tomáš Vichta 18. března 2017 SOLID principy v OOP návrhu
  • 2. 2 SOLID principy S ingle-responsiblity O pen-closed L iskov substitution I nterface segregation D ependency inversion
  • 3. 3 Proč SOLID? › Snadnější a bezpečnější rozšiřitelnost › Přehlednost › Znovupoužívání kódu – Jednotné chování aplikace › Lépe testovatelný kód – unit testy i mocky pro testovací prostředí › Méně bugů
  • 4. 4 Single Responsibility Principle › 1 třída má 1 zodpovědnost › Není dobré jít do extrému (třídy s 1 řádkem kódu) › Ale když váhám, tak kód raději hned rozdělím na více tříd SINGLE RESPONSIBILITY PRINCIPLE Just Because You Can, Doesn't Mean You Should
  • 5. 5 Single Responsibility Principle class BigClass { public void Load() { } public void Compute() { } } class Loader { public void Load() { } } class Calculator { public void Compute() { } }
  • 6. 6 Dependency Inversion Principle › Třída má záviset na abstrakci – Interface, base (často abstract) class › Tzn. implementaci dodáme třídě zvenku – Constructor, Property, Method Injection › Souvisí s Inversion of Control/Dependency Injection 1 2 3 1 2 3
  • 7. 7 Dependency Inversion Principle – příklad class BetterComputeController { private readonly ICalculator _calc; public IMailer Mailer { get; set; } public BetterComputeController(ICalculator calc) { _calc = calc; } public void Process(object model) { _calc.Compute(); Mailer?.Send("computed successfully"); } } class BadComputeController { public void Process(object model) { new Calculator().Compute(); if (true) new Mailer().Send("computed successfully"); } }
  • 8. 8 Open-closed Principle › Nová funkcionalita se přidává novým kódem, nikoli modifikací starého › Open – Nová funkcionalita = nová třída • Děděním • Novou implementací stávajících interfaces › Closed – Nesahám do stávajících tříd › Netýká se bugfixingu, refaktoringu, většinou ani změn
  • 10. 10 Liskov substitution Principle › Subclass se chová navenek stejně jako base class › Rozšiřuje Open-closed princip › Metody v Subclass – Nevyhazovat žádné nové výjimky (kromě poděděných), protože s nimi klient nemusí počítat. – Nesmí vyžadovat větší omezení na vstupní argumenty – "Postconditions cannot be weakened in a subtype." › Neměnit vnější stav, pokud to klient nečeká › Typický příklad – čtverec vs. obdélník a metody SetWidth(), SetHeight(), ComputeArea()
  • 11. 11 Liskov substitution Principle – příklad class Liskov «interface» ISettingStore + Read(string): string «interface» IWritableSettingStore + Clear(): void SettingManager + ClearAll(): void + GetColors(): IEnumerable<string> + SettingManager(ISettingStore[], IWritableSettingStore[]) InMemorySetting + Clear(): void + Read(string): string DefaultConstantSettings + Read(string): string -_settings -_writableSettings
  • 12. 12 Interface Segregation Principle › Každá funkcionalita má svůj, co nejmenší interface › Klient: Používám interface/třídu – jsou tam jen metody, které potřebuji › Implementuji interface – ten by neměl mít metody, které v mojí implementaci nemají smysl – tj. nepotřebuji NotSupportedException jako jediný řádek metody › Souvisí se Single Responsibility z pohledu konzumenta (klienta) – Ale není to to samé, je legitimní dělit 1 responsibility do více interfaces
  • 13. 13 Interface Segregation Principle – příklad interface IRepository { object Read(); void Save(object data); } class BadRepository : IRepository { public object Read() { return null; } public void Save(object data) { } } interface IReader { object Read(); } interface IWriter { void Save(object data); } interface IRepository : IReader, IWriter{} class BetterRepository : IReader, IWriter, IRepository { public object Read() { return null; } public void Save(object data) { } }
  • 14. 14 Interface Segregation Principle – příklad public struct Int32 : IComparable, IFormattable, IConvertible public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
  • 15. 15 Jak poznat non-SOLID kód? › Varovné znaky – Mnoho velkých if, velký počet if ve třídě – typeof(Subclass) – if(x is Subclass) – Přetypování: var concreteObject = (Subclass)someObject – Mnoho public metod, mnoho metod v interface – Potřeba implementovat metody vyhozením • .NET: NotSupportedException • Java: UnsupportedOperationException – Lze špatně nebo vůbec testovat
  • 17. Profinit EU, s.r.o. Tychonova 2, 160 00 Praha 6 Telefon + 420 224 316 016 Web www.profinit.eu LinkedIn linkedin.com/company/profinit Twitter twitter.com/Profinit_EU Děkujeme za pozornost

Editor's Notes

  1. -příklady -ukázat test
  2. Others příklad - NotSupportedEx
  3. Ukázat Controller
  4. -nazvý tříd -složitější?