Date post: | 16-Jan-2017 |
Category: |
Software |
Upload: | matthiasnoback |
View: | 750 times |
Download: | 7 times |
Principles of Package DesignHow to create cohesive, stable packages
Matthias Noback
Tight coupling
What we do
Packages many different kinds
Class design
Principles of Package Design
leanpub.com/principles-of-package-design
Package design Cohesion
Package design Coupling
A - Cohesion principles Perspective: the package in isolation
!
1 - The Release Reuse Equivalence Principle The granule of reuse is the granule of release
1 - The Release Reuse Equivalence Principle
• Version control and hosting • Composer package definition • Meta-files • Auto-loading !
• Semantic versioning • Branches • Tags • Backward compatibility
• Quality control
1 - The Release Reuse Equivalence Principle The Rule of Three
blog.codinghorror.com/rule-of-three/
1 - The Release Reuse Equivalence Principle
If you don't have the time to turn your reusable code into a proper package...
!Don't release it.
2- The Common Reuse Principle Classes that are used together are packaged together
If you use one class of a package, you will use all its other classes too.
2- The Common Reuse Principle Smell: Feature strata
2- The Common Reuse Principle Example of feature strata: the Symfony Security Component
2- The Common Reuse Principle Smell: Classes with different dependencies
2- The Common Reuse Principle Example of different dependencies: Gaufrette
2- The Common Reuse Principle Different dependencies: Gaufrette
{ "name": "knplabs/gaufrette", ... "suggest": { "knplabs/knp-gaufrette-bundle": "to use with Symfony2", "dropbox-php/dropbox-php": "to use the Dropbox adapter", "rackspace/php-opencloud" : "to use Opencloud adapter", "herzult/php-ssh": "to use SFtp adapter", "phpseclib/phpseclib": "to use PhpseclibSftp adapter", "aws/aws-sdk-php": "to use the Amazon S3 adapter", "amazonwebservices/aws-sdk-for-php": "to use the legacy Amazon S3 adapters", "doctrine/dbal": "to use the Doctrine DBAL adapter", "microsoft/windowsazure": "to use Microsoft Azure Blob Storage adapter", "ext-zip": "to use the Zip adapter", "ext-apc": "to use the APC adapter", ... },
2 - The Common Reuse Principle Leszek Prabucki's response
3 - The Common Closure Principle Classes that change together are packaged together
3 - The Common Closure Principle Reasons for change
• The application's features change • The business rules change • The web framework's best practices change • The persistence library's configuration changes • ...
3 - The Common Closure Principle Smell: code for multiple application layers
• Web User Interface • Command-line interface • Model • Infrastructure services
B - Coupling principles Perspective: the package in relation to other packages
4 - The Acyclic Dependencies Principle The dependency graph of packages must have no cycles
4 - The Acyclic Dependencies Principle
Stability
Something is stable if it's resistant to change.
5 - The Stable Dependencies Principle An irresponsible package
5 - The Stable Dependencies Principle A dependent package
5 - The Stable Dependencies Principle An instable package: irresponsible and dependent
5 - The Stable Dependencies Principle A responsible package
5 - The Stable Dependencies Principle An independent package
5 - The Stable Dependencies Principle A stable package: responsible and independent
5 - The Stable Dependencies Principle Depend in the direction of stability
5 - The Stable Dependencies Principle Counter example
6 - The Stable Abstractions Principle What is more likely to change?
!
• Something concrete or something abstract?
• A class or an interface?
6 - The Stable Abstractions Principle Abstractness should increase with stability
SummaryReuse/release equivalence principle
Reuse only code that you can release as a product.
Common reuse principle
All code in a package is reused at the same time.
Common closure principle
Code in a package only changes for a few reasons.
Acyclic dependencies principle
No cycles in the dependency graph.
Stable dependencies principle
Only depend on more stable packages.
Stable abstractions principle
More stable packages are also more abstract.
Word of advice
You can't maximize them all at the same time.
!Keep them in mind while you are
working on a package.
Principles of Package Design
leanpub.com/principles-of-package-design/c/phpconpl
Questions?
@matthiasnoback
joind.in/16212
Thank you!
Images• http://cleancoders.com/
• https://github.com/
• https://bitbucket.org/
• https://packagist.org/
• http://martinfowler.com/eaaCatalog/
• http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
• http://blog.8thlight.com/uncle-bob/2014/05/14/TheLittleMocker.html