Principles of Package Design FOSDEM 2015

Post on 16-Jul-2015

727 views 4 download

Tags:

Transcript of Principles of Package Design FOSDEM 2015

Principles of Package DesignHow to create cohesive, stable packages

Matthias Noback - Noback's OfficeFOSDEM - 1 Feb 2015

Writingphp-and-symfony.matthiasnoback.nl

2/46

A Year With Symfony

leanpub.com/a-year-with-symfony

3/46

Tight couplingCoupling to a framework

4/46

Code

5/46

PackagesThere are many different kinds

6/46

Class design

7/46

Package designNothing?

butunclebob.com

8/46

Principles of Package Design

leanpub.com/principles-of-package-design

9/46

Package designCohesion

10/46

Package designCoupling

11/46

A - Cohesion principlesPerspective: the package in isolation

12/46

1 - The Release Reuse Equivalence PrincipleThe granule of reuse is the granule of release

13/46

1 - The Release Reuse Equivalence Principle

Version control and hostingComposer package definitionMeta-filesAuto-loading

····

Semantic versioning

Quality control

·BranchesTagsBackward compatibility

---

·

14/46

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.

15/46

2- The Common Reuse PrincipleClasses that are used together are packaged together

If you use one class of a package,you will use all its other classes too.

16/46

2- The Common Reuse PrincipleSmell: Feature strata

17/46

2- The Common Reuse PrincipleExample of feature strata: the Symfony Security Component

18/46

2- The Common Reuse PrincipleSmell: Classes with different dependencies

19/46

2- The Common Reuse PrincipleExample of different dependencies: Gaufrette

20/46

2- The Common Reuse PrincipleDifferent 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",

...

},

...

}21/46

2 - The Common Reuse PrincipleLeszek Prabucki's response

22/46

3 - The Common Closure PrincipleClasses that change together are packaged together

23/46

3 - The Common Closure PrincipleReasons for change

The application's features changeThe business rules changeThe web framework's best practices changeThe persistence library's configuration changes...

·····

24/46

3 - The Common Closure PrincipleSmell: code for multiple application layers

Web User InterfaceCommand-line interfaceModelInfrastructure services

····

25/46

B - Coupling principlesPerspective: the package in relation to other packages

26/46

4 - The Acyclic Dependencies PrincipleThe dependency graph of packages must have no cycles

27/46

4 - The Acyclic Dependencies Principle

28/46

Stability

Something is stable if it's resistant to change.

29/46

5 - The Stable Dependencies PrincipleAn irresponsible package

30/46

5 - The Stable Dependencies PrincipleA dependent package

31/46

5 - The Stable Dependencies PrincipleAn instable package: irresponsible and dependent

32/46

5 - The Stable Dependencies PrincipleA responsible package

33/46

5 - The Stable Dependencies PrincipleAn independent package

34/46

5 - The Stable Dependencies PrincipleA stable package: responsible and independent

35/46

5 - The Stable Dependencies PrincipleDepend in the direction of stability

36/46

5 - The Stable Dependencies PrincipleCounter example

37/46

6 - The Stable Abstractions PrincipleWhat is more likely to change?

Something concrete or something abstract?A class or an interface?

··

38/46

6 - The Stable Abstractions PrincipleAbstractness should increase with stability

39/46

SummaryReuse/release equivalence principle

Common reuse principle

Common closure principle

Acyclic dependencies principle

Stable dependencies principle

Stable abstractions principle

·Reuse only code that you can release as a product.-

·All code in a package is reused at the same time.-

·Code in a package only changes for a few reasons.-

·No cycles in the dependency graph.-

·Only depend on more stable packages.-

·More stable packages are also more abstract.-

40/46

Word of advice

You can't maximize them all at the same time.

Keep them in mind while you are working on a package.

41/46

Principles of Package Design

leanpub.com/principles-of-package-design

42/46

Questions?

twitter @matthiasnoback

feedback joind.in/13057

leanpub leanpub.com/principles-of-package-design

43/46

46/46