SlideShare a Scribd company logo
1 of 39
Практики написання коду
Simple




    http://www.infoq.com/presentations/Simple-Made-Easy
http://www.slideshare.net/evandrix/simple-made-easy
vector<vector<int>> getData()
{
    vector<vector<int>> vector1;
    for (auto x = vector.begin();
          x != vector.end(); ++x)
    {                               Це може бути легко
        if (x->at(0) == 4)               (для вас)
        {                                 (зараз)
             vector1.push_back(*x);
        }
    }
    return vector1;
}
                                        http://amzn.com/0132350882
vector<vector<int>> getFlaggedCells()
{
    vector<vector<int>> flaggedCells;
    for (auto cell : gameBoard)
    {
        if (cell.at(STATUS) == FLAGGED)
        {
            flaggedCells.push_back(cell);
        }
    }
                                  Цей код легший для
    return flaggedCells;
                                      розуміння
}

                                       http://amzn.com/0132350882
vector<Cell> getFlaggedCells()
{
    vector<Cell> flaggedCells;
    for (auto cell : gameBoard)
    {
        if (cell.isFlagged())
        {
            flaggedCells.push_back(cell);
        }
    }                             Цей код легший і
    return flaggedCells;             простіший!
}
vector<Cell> getFlaggedCells()
{
    vector<Cell> flaggedCells;
    copy_if(
        begin(gameBoard),
        end(gameBoard),
        back_inserter(flaggedCells),
        [](Cell cell) { return cell.isFlagged(); });
    return flaggedCells;
}
                                    Цей код простіший
Простота і складність об’єктивні і абсолютні
Легкість і важкість суб’єктивні і відносні
Складно – коли функція відповідає за
декілька концепцій:
  Що + Як
  I/O + бізнес правила
  БД + бізнес правила
  Concurrency + domain
  …
Idiomatic code




         http://herbsutter.com/elements-of-modern-c-style/
Least surprise




      http://en.wikipedia.org/wiki/Principle_of_least_astonishment
http://fomuvi.ru/zadachki/raznoobraznye-zadachki/xudozhnik-i-proxozhij.html
http://fomuvi.ru/zadachki/raznoobraznye-zadachki/xudozhnik-i-proxozhij.html
http://fomuvi.ru/zadachki/raznoobraznye-zadachki/xudozhnik-i-proxozhij.html
for (int i = 0; i < v.size(); i++)
{
    cout << i << " " << v[i] << endl;
}

          for (int i = 0; v.size() - 1 >= i; ++i)
          {
              cout << i << " " << v[i] << endl;
          }
Side effects
Global mutable state
Coupling
Coupling (зв’язність)
• Afferent
  – Скільки компонентів залежать від модуля
  – Показує наскільки модуль відповідальний
• Efferent
  – Від скількох компонентів залежить модуль
  – Показує наскільки модуль незалежний
  – Включає: наслідування, interface impl, типи
    параметрів, типи змінних, exceptions,...
• Ca and Ce є метриками стабільності
Instability
               I = Ce / (Ce + Ca)


        Ce                          Ca



• показує нестійкість до змін
• 0 – стабільний модуль
• 1 – нестабільний
Cohesion (пов’язаність, зчеплення)
• Показує наскільки сильні взаємозв’язки між
  частинами одного модулю
• Чи всі методи класу використовують всі
  його поля
• Низька пов’язаність:
  – Клас з багатьма статичними методами
  – “Несфокусований” клас
Cohesion

          Кореляція:
high complexity and low cohesion

           Кореляція:
complexity and number of defects
Low coupling + high cohesion
сприяють легкому внесенню змін у ПЗ

 Більшість шаблонів проектування є
рецептами для зниження coupling та
       підвищення cohesion
Dependencies
class Course
{
public:
    void Apply(shared_ptr<User> user)
    {
        auto application = new Application(/*...*/);
        //...
        auto email = new SmtpEmailSender();
        email->send("New course application!",
            emailSettings.directorEmail());
    }
};
High level
                             module


              Course
Depends
  on




          SmtpEmailSender

                               Low level
                                module
class Course
{
private:
    IEmailSender* email;

public:
    Course(IEmailSender* email) : email(email) {}

     void Apply(shared_ptr<User> user)
     {
         auto application = new Application(/*...*/);
         //...
         email->send("New course application!");
     }
};
High level
                module


  Course




IEmailSender                SmtpEmailSender


               Implements
Application



  Course




IEmailSender             SmtpEmailSender
High level
                  module


Course                         IEmailSender



 Dependency is
   inverted
                              SmtpEmailSender
Dependency inversion
• High level modules should not depend on
  low-level modules
• Both should depend on abstractions
• Abstractions should not depend on details
• Details should depend on abstractions
Lower coupling
                Що отримуємо
• Залежності вказуються явно, немає прихованих
  залежностей
• Класи самодокументовані
• Класи більше не відповідають за створення об’єктів
• Після створення клас гарантовано знаходиться у
  робочому стані
• Легко знаходити класи з багатьма параметрами в
  конструкторі (і зменшувати їх відповідальності)
• Легше знаходити методи, яким потрібні не всі
  залежності класу
class UsersImporter
{
public:
    void import()
    {
        auto importContext =
           new ImportContext(currentUserName);
        // ...
        fileImporter->import();
        // ...
    }
};
void import()
{
    auto importContext =
        new ImportContext(currentUserName);
    // ...
    IFileImporter* fileImporter =
        new CsvFileImporter(importContext);
    fileImporter->import();
    // ...                       ? Залежить від ImportContext
    delete fileImporter;
                                  ? Тип повинен визначатись
}                                 залежно від ImportContext

                                        ? Потрібно керувати часом
                                           життя FileImporter’а
Abstract Factory. Потреба:
• Залежність залежить від параметра, який не
  відомий клієнту на час його створення
• if/else та switch блоки для вирішення, яку
  залежність створити
• Залежність потрібно до-ініціалізувати
• Об’єкт повинен керувати часом життя
  залежності
UsersImporter     IFileImporter




CsvFileImporter
UsersImporter     IFileImporterFactory



 IFileImporter




CsvFileImporter   FileImporterFactory
Lowering coupling:
       simpler
but sometimes harder
Broken windows




        http://en.wikipedia.org/wiki/Broken_windows_theory
Code Complete,
Steve McConnell
http://amzn.com/0735619670
http://www.ozon.ru/context/detail/id/5508646/




Clean Code,
Robert C. Martin
http://amzn.com/0132350882
http://www.ozon.ru/context/detail/id/6733562/

More Related Content

What's hot

01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
 

What's hot (15)

Design patterns part 1
Design patterns part 1Design patterns part 1
Design patterns part 1
 
JavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basisJavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basis
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
 
System programing module 2
System programing module 2System programing module 2
System programing module 2
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
 
Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
 
Version control
Version controlVersion control
Version control
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
 
IT Talks The c++'s simplest smart pointers in depth
IT Talks The c++'s simplest smart pointers in depthIT Talks The c++'s simplest smart pointers in depth
IT Talks The c++'s simplest smart pointers in depth
 
Xdebug (ukr)
Xdebug (ukr)Xdebug (ukr)
Xdebug (ukr)
 
Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5
 
07 Containers
07 Containers07 Containers
07 Containers
 

Viewers also liked

cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
Amazon Web Services
 
cpp-2013 #11 Constness and Exceptions
cpp-2013 #11 Constness and Exceptionscpp-2013 #11 Constness and Exceptions
cpp-2013 #11 Constness and Exceptions
Amazon Web Services
 
Import,export procedure
Import,export procedureImport,export procedure
Import,export procedure
rishnrish
 
Export procedure
Export procedureExport procedure
Export procedure
Jay Parekh
 
EXPORT PROCEDURE & DOCUMENTATION
EXPORT PROCEDURE & DOCUMENTATIONEXPORT PROCEDURE & DOCUMENTATION
EXPORT PROCEDURE & DOCUMENTATION
vikas chauhan
 
Import & export presentation
Import & export presentationImport & export presentation
Import & export presentation
Eric Lee
 
A PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATION
A PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATIONA PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATION
A PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATION
Sagar Anand
 

Viewers also liked (16)

cpp-2013 #16 Automated testing
cpp-2013 #16 Automated testingcpp-2013 #16 Automated testing
cpp-2013 #16 Automated testing
 
cpp-2013 #18 Qt Part 2
cpp-2013 #18 Qt Part 2cpp-2013 #18 Qt Part 2
cpp-2013 #18 Qt Part 2
 
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
 
cpp-2013 #4 Memory management
cpp-2013 #4 Memory managementcpp-2013 #4 Memory management
cpp-2013 #4 Memory management
 
cpp-2013 #11 Constness and Exceptions
cpp-2013 #11 Constness and Exceptionscpp-2013 #11 Constness and Exceptions
cpp-2013 #11 Constness and Exceptions
 
cpp-2013 #17 Libraries
cpp-2013 #17 Librariescpp-2013 #17 Libraries
cpp-2013 #17 Libraries
 
High Availability Application Architectures in Amazon VPC (ARC202) | AWS re:I...
High Availability Application Architectures in Amazon VPC (ARC202) | AWS re:I...High Availability Application Architectures in Amazon VPC (ARC202) | AWS re:I...
High Availability Application Architectures in Amazon VPC (ARC202) | AWS re:I...
 
Aspect-Oriented Programming (AOP) in .NET
Aspect-Oriented Programming (AOP) in .NETAspect-Oriented Programming (AOP) in .NET
Aspect-Oriented Programming (AOP) in .NET
 
Export management ppt
Export management pptExport management ppt
Export management ppt
 
Import,export procedure
Import,export procedureImport,export procedure
Import,export procedure
 
Export procedure
Export procedureExport procedure
Export procedure
 
EXPORT PROCEDURE & DOCUMENTATION
EXPORT PROCEDURE & DOCUMENTATIONEXPORT PROCEDURE & DOCUMENTATION
EXPORT PROCEDURE & DOCUMENTATION
 
Export Procedures and Documents
Export Procedures and DocumentsExport Procedures and Documents
Export Procedures and Documents
 
Import & export presentation
Import & export presentationImport & export presentation
Import & export presentation
 
A PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATION
A PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATIONA PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATION
A PROJECT REPORT ON EXPORT PROCESS AND DOCUMENTATION
 
EXPORT IMPORT
EXPORT IMPORTEXPORT IMPORT
EXPORT IMPORT
 

Similar to cpp-2013 #20 Best practices

Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій МаренковJoomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
Igor Bronovskyy
 
Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex Developing
Roman Shuper
 
ASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptx
Ihor34
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
olegapster
 
12 Architecture
12 Architecture12 Architecture
12 Architecture
eleksdev
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net
eleksdev
 
Lec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edLec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування ed
cit-cit
 
02 Copying Objects
02 Copying Objects02 Copying Objects
02 Copying Objects
olegapster
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilities
olegapster
 

Similar to cpp-2013 #20 Best practices (20)

V24 com to_net
V24 com to_netV24 com to_net
V24 com to_net
 
Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій МаренковJoomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
 
Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex Developing
 
Design patterns part 2
Design patterns part 2Design patterns part 2
Design patterns part 2
 
ASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptx
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
 
tsql
tsqltsql
tsql
 
12 Architecture
12 Architecture12 Architecture
12 Architecture
 
ASP.Net MVC
ASP.Net MVCASP.Net MVC
ASP.Net MVC
 
08 Templates
08 Templates08 Templates
08 Templates
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net
 
Tdd, ти де?
Tdd, ти де?Tdd, ти де?
Tdd, ти де?
 
ASP.Net basics
ASP.Net basics ASP.Net basics
ASP.Net basics
 
Lec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edLec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування ed
 
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
 
Caliburn Micro Overview
Caliburn Micro OverviewCaliburn Micro Overview
Caliburn Micro Overview
 
Automated testing
Automated testingAutomated testing
Automated testing
 
02 Copying Objects
02 Copying Objects02 Copying Objects
02 Copying Objects
 
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilities
 

More from Amazon Web Services

More from Amazon Web Services (11)

cpp-2013 #15 Databases
cpp-2013 #15 Databasescpp-2013 #15 Databases
cpp-2013 #15 Databases
 
cpp-2013 #14 Основи Qt
cpp-2013 #14 Основи Qtcpp-2013 #14 Основи Qt
cpp-2013 #14 Основи Qt
 
cpp-2013 #13 C++11
cpp-2013 #13 C++11cpp-2013 #13 C++11
cpp-2013 #13 C++11
 
cpp-2013 #9 STL Algorithms Part 1
cpp-2013 #9 STL Algorithms Part 1cpp-2013 #9 STL Algorithms Part 1
cpp-2013 #9 STL Algorithms Part 1
 
cpp-2013 #8 STL Containers Part 2
cpp-2013 #8 STL Containers Part 2cpp-2013 #8 STL Containers Part 2
cpp-2013 #8 STL Containers Part 2
 
cpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL Containerscpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL Containers
 
cpp-2013 #6 OOP Part 2
cpp-2013 #6 OOP Part 2cpp-2013 #6 OOP Part 2
cpp-2013 #6 OOP Part 2
 
cpp-2013 #5 File and network input/output
cpp-2013 #5 File and network input/outputcpp-2013 #5 File and network input/output
cpp-2013 #5 File and network input/output
 
cpp-2013 #3 OOP Basics
cpp-2013 #3 OOP Basicscpp-2013 #3 OOP Basics
cpp-2013 #3 OOP Basics
 
cpp-2013 #2 Organizing your code
cpp-2013 #2 Organizing your codecpp-2013 #2 Organizing your code
cpp-2013 #2 Organizing your code
 
cpp-2013 #1 C++ basics
cpp-2013 #1 C++ basicscpp-2013 #1 C++ basics
cpp-2013 #1 C++ basics
 

cpp-2013 #20 Best practices

  • 2. Simple http://www.infoq.com/presentations/Simple-Made-Easy
  • 4. vector<vector<int>> getData() { vector<vector<int>> vector1; for (auto x = vector.begin(); x != vector.end(); ++x) { Це може бути легко if (x->at(0) == 4) (для вас) { (зараз) vector1.push_back(*x); } } return vector1; } http://amzn.com/0132350882
  • 5. vector<vector<int>> getFlaggedCells() { vector<vector<int>> flaggedCells; for (auto cell : gameBoard) { if (cell.at(STATUS) == FLAGGED) { flaggedCells.push_back(cell); } } Цей код легший для return flaggedCells; розуміння } http://amzn.com/0132350882
  • 6. vector<Cell> getFlaggedCells() { vector<Cell> flaggedCells; for (auto cell : gameBoard) { if (cell.isFlagged()) { flaggedCells.push_back(cell); } } Цей код легший і return flaggedCells; простіший! }
  • 7. vector<Cell> getFlaggedCells() { vector<Cell> flaggedCells; copy_if( begin(gameBoard), end(gameBoard), back_inserter(flaggedCells), [](Cell cell) { return cell.isFlagged(); }); return flaggedCells; } Цей код простіший
  • 8. Простота і складність об’єктивні і абсолютні Легкість і важкість суб’єктивні і відносні Складно – коли функція відповідає за декілька концепцій: Що + Як I/O + бізнес правила БД + бізнес правила Concurrency + domain …
  • 9. Idiomatic code http://herbsutter.com/elements-of-modern-c-style/
  • 10. Least surprise http://en.wikipedia.org/wiki/Principle_of_least_astonishment
  • 14. for (int i = 0; i < v.size(); i++) { cout << i << " " << v[i] << endl; } for (int i = 0; v.size() - 1 >= i; ++i) { cout << i << " " << v[i] << endl; }
  • 18. Coupling (зв’язність) • Afferent – Скільки компонентів залежать від модуля – Показує наскільки модуль відповідальний • Efferent – Від скількох компонентів залежить модуль – Показує наскільки модуль незалежний – Включає: наслідування, interface impl, типи параметрів, типи змінних, exceptions,... • Ca and Ce є метриками стабільності
  • 19. Instability I = Ce / (Ce + Ca) Ce Ca • показує нестійкість до змін • 0 – стабільний модуль • 1 – нестабільний
  • 20. Cohesion (пов’язаність, зчеплення) • Показує наскільки сильні взаємозв’язки між частинами одного модулю • Чи всі методи класу використовують всі його поля • Низька пов’язаність: – Клас з багатьма статичними методами – “Несфокусований” клас
  • 21. Cohesion Кореляція: high complexity and low cohesion Кореляція: complexity and number of defects
  • 22. Low coupling + high cohesion сприяють легкому внесенню змін у ПЗ Більшість шаблонів проектування є рецептами для зниження coupling та підвищення cohesion
  • 24. class Course { public: void Apply(shared_ptr<User> user) { auto application = new Application(/*...*/); //... auto email = new SmtpEmailSender(); email->send("New course application!", emailSettings.directorEmail()); } };
  • 25. High level module Course Depends on SmtpEmailSender Low level module
  • 26. class Course { private: IEmailSender* email; public: Course(IEmailSender* email) : email(email) {} void Apply(shared_ptr<User> user) { auto application = new Application(/*...*/); //... email->send("New course application!"); } };
  • 27. High level module Course IEmailSender SmtpEmailSender Implements
  • 29. High level module Course IEmailSender Dependency is inverted SmtpEmailSender
  • 30. Dependency inversion • High level modules should not depend on low-level modules • Both should depend on abstractions • Abstractions should not depend on details • Details should depend on abstractions
  • 31. Lower coupling Що отримуємо • Залежності вказуються явно, немає прихованих залежностей • Класи самодокументовані • Класи більше не відповідають за створення об’єктів • Після створення клас гарантовано знаходиться у робочому стані • Легко знаходити класи з багатьма параметрами в конструкторі (і зменшувати їх відповідальності) • Легше знаходити методи, яким потрібні не всі залежності класу
  • 32. class UsersImporter { public: void import() { auto importContext = new ImportContext(currentUserName); // ... fileImporter->import(); // ... } };
  • 33. void import() { auto importContext = new ImportContext(currentUserName); // ... IFileImporter* fileImporter = new CsvFileImporter(importContext); fileImporter->import(); // ... ? Залежить від ImportContext delete fileImporter; ? Тип повинен визначатись } залежно від ImportContext ? Потрібно керувати часом життя FileImporter’а
  • 34. Abstract Factory. Потреба: • Залежність залежить від параметра, який не відомий клієнту на час його створення • if/else та switch блоки для вирішення, яку залежність створити • Залежність потрібно до-ініціалізувати • Об’єкт повинен керувати часом життя залежності
  • 35. UsersImporter IFileImporter CsvFileImporter
  • 36. UsersImporter IFileImporterFactory IFileImporter CsvFileImporter FileImporterFactory
  • 37. Lowering coupling: simpler but sometimes harder
  • 38. Broken windows http://en.wikipedia.org/wiki/Broken_windows_theory
  • 39. Code Complete, Steve McConnell http://amzn.com/0735619670 http://www.ozon.ru/context/detail/id/5508646/ Clean Code, Robert C. Martin http://amzn.com/0132350882 http://www.ozon.ru/context/detail/id/6733562/