The Dirty Dozen

Dirty Dozen

Kuba Werłos


Software House Innovative Technologies


by
E corp

KICK ME

Chuck Norris

Keep It Complicated Keep Me Employed

One good programmer can easily create two new jobs a year.

KICK ME


  • I am having trouble understanding this code.
  • Let's take a look.
  • Do you see this function? It calls these 13 other functions and has roughly 1000 lines of commented out code in it.
  • Ah yes, that is the Job Security Design Pattern in action!

Hundred responsibilities principle

God
the more the merrier

knows very much or does very much

knows very muchLOC, properties, methods
does very muchcyclomatic complexity

Hundred responsibilities principle

LOCCC
1.
giggsey/libphonenumber-for-php/geocoding/data/en/61.php
42 571
1
2.
Mpdf\Mpdf
27 208
7 007
3.
TCPDF
24 578
4 379
4.
voku\helper\UTF8
14 013
1 426
5.
TYPO3\CMS\Core\DataHandling\DataHandler
9 586
1 457
6.
PhpOffice\PhpSpreadsheet\Reader\Xls
7 947
1 011
7.
ScssPhp\ScssPhp\Compiler
7 709
1 197
8.
WordPress/wp-includes/functions.php
7 403
737

Untestability

Profits of not having tests:

  • not doing work no one pays for
  • no problems with failing build on Jenkins
  • increase need for manual testing
  • more thrilling changes to the code
  • make it harder to change the code without worrying that anything will get broken
  • deprive us from having documentation for what the code is actually meant to do

Untestability


open/closed principle


A module should be open for modification.

A module should be closed for extension.

Redefine the functionality


reinventing the wheel

re-implementing (limited) PHP functions

prefer implementing custom solutions over using open source library

overriding methods

Really big interfaces


big ⟶ complicated

complicated ⟶ advanced

advanced ⟶ smart

Really big interfaces

Methods
1.
Carbon\CarbonInterface
348
2.
Magento\Sales\Api\Data\OrderInterface
274
3.
Illuminate\Support\Enumerable
112
4.
Drupal\Core\Form\FormStateInterface
91
5.
Knp\Menu\ItemInterface
58
6.
Doctrine\ORM\Query\TreeWalker
50
7.
Zend\Barcode\Object\ObjectInterface
47
8.
Symfony\Component\Form\FormInterface
35

You should rely on others


Extend third party libraries directly
class InvoicePdf extends FPDF
{
}

Use third party libraries directly
new Symfony\Component\Process\Process(/* ... */);
Hundred responsibilities principle
Untestability
Redefine the functionality
Really big interfaces
You should rely on others

Bus factor