Nanos gigantium humeris insidentes DESIGN PATTERN INSIDE SYMFONY2
GIANTS
liurrrgio GIULIO DE DONATO GIORGIO CEFARO @liuggio @giorrrgio
DESIGN PATTERN?
DESIGN PATTERN A solution of a problem in a context James O. Coplien (1994)
DESIGN PATTERN “ For me a pattern is primarily a way to chunk up advice about a topic “
#1
FRONT CONTROLLER INTENT: A controller that handles all requests for a Web site
FRONT CONTROLLER web/app.php
FRONT CONTROLLER ... and ? web/app.php
INTENT: DECORATOR Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
DECORATOR SymfonyComponentHttpKernelHttpCacheHttpCache
U DUNNO HttpKernelInterface? SymfonyComponentHttpKernelHttpKernelInterface
KERNEL AND SERVICE CONTAINER SymfonyComponentHttpKernelKernel
INVERSION OF CONTROL INTENT: Inversion of control is a style of software construction where reusable code controls the execution of problem-specific code
INVERSION OF CONTROL 1988
“ Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.”
INVERSION OF CONTROL HOLLYWOOD PRINCIPLE: “ DON’T CALL US WE’LL CALL YOU ”
INVERSION OF CONTROL
PICO CONTAINER DEFINITION: "Dependency Injection is where components are given their dependencies through their constructors, methods, or directly into fields."
Dependency injection allows the removal of hard-coded dependencies and makes it possible to change them, whether at run-time or compiletime.
INJECTING A TRANSPORT INSIDE A MAILER
- FIGHT OF THE DAY - SERVICE CONTAINER vs DEPENDENCY INJECTION
INVERSION OF CONTROL INTENT: DECOUPLE DECOUPL DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPLE
DEPENDENCY INJECTION AND FRAMEWORKS DI ?? Grafico con spaghetti, infermiera che fa la puntura, lista della spesa per l'antipattern service locator, qualcosa di galattico per l'enhanced injection (tipo pulp fiction) http://www.loosecouplings.com/2011/01/dependency-injection-using-di-container.html DIC
FACTORY METHOD INTENT: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
FACTORY METHOD - DO IT WITH THE DIC
ABSTRACT FACTORY INTENT: Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
ABSTRACT FACTORY - SecurityFactoryInterface SymfonyBundleSecurityBundleDependencyInjectionSecurityFactorySecurityFactoryInterface
INTENT: BUILDER Separate the construction of a complex object from its representation so that the same construction process can create different representations.
FORM BUILDER SymfonyComponentFormFormBuilderInterface
FORM BUILDER
PROXY INTENT: Provide a surrogate or placeholder for another object to control access to it.
DOCTRINE PROXY app/cache/doctrine/odm/Proxies/ ...
MEDIATOR INTENT: Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
ner file Kernel :: REQUEST rLi ste gm ent Fra ste Li on ssi Se Pro List ene r MEDIATOR er ten rLis te Rou ner EVENT DISPATCHER Loca leLis tene r all ew Fir
STRATEGY aka POLICY INTENT: Defines a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
FragmentRendererInterface SymfonyComponentHttpKernelFragmentFragmentRendererInterface
Fragment Renderers SymfonyComponentHttpKernelFragment...
DATA MAPPER INTENT: A layer of Mappers that moves data between objects and a database while keeping them independent of each other and the mapper itself.
VISITOR INTENT: Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
VALIDATION VISITOR SymfonyComponentValidator..
MVC er n Co ll tro w Vie el d Mo
AbstractionInversion, AccidentalComplexity, AccidentalInclusion, AddingEpicycles, AlcoholFueledDevelopment, AmbiguousViewpoint, AnalogyBreakdownAntiPattern, AnalysisParalysis, AnAthena, AppointedTeam, ArchitectsDontCode, ArchitectsPlayGolf, ArchitectureAsRequirements, ArchitectureByImplication, AsynchronousUnitTesting, AutogeneratedStovepipeAntiPattern, BandAid, BearTrap?, BigBallOfMud, BlameStorming, BlowhardJamboree, BoatAnchor, CargoCult, CarParkSyndrome, CascadingDialogBoxesAntiPattern, ContinuousObsolescence, ConfusionOfObjectives, ControlFreak, CopyAndPasteProgramming, CornCob, CoverYourAssets, CreepingFeaturitis, CrciCards, CryptoCracy, DeadEnd, DeathByPlanning, DecisionByArithmetic, DesignByCommittee, DesignForTheSakeOfDesign., DiscordantRewardMechanisms, DoerAndKnower, DryWaterhole, EgalitarianCompensation, EmailIsDangerous, EmperorsNewClothes, EmpireBuilding, ExceptionFunnel, FalseEconomy, FalseSurrogateEndpoint, FearOfSuccess, FireDrill, FloatingPointCurrency, FloatingPointFractions, FoolTrap, FunctionalDecomposition, FungibleTeams, FungibleProjectManager, GeographicallyDistributedDevelopment, GiveMeEstimatesNow, GlassWall, GodClass, GoldenHammer, GroundHogDayProject, HalfDoneIsEnough, HeirApparent, HeroCulture, HiddenRequirements, IdiotProofProcess., IfItIsWorkingDontChange, IfOk, InappropriateTechnicalObjective, InputKludge, ItsAnOperatorProblem, JobKeeper, JumbleAntipattern, JunkyardCoding, KillTwoBirdsWithOneStone, KitchenSinkDesign, LavaFlow, LeadingRequest, MagicContainer, ManagerControlsProcess, MushroomManagement, Nationalism, NetNegativeProducingProgrammer, NotInventedHere, NotTheAppropriateProtocol, NullFlag, OverGeneralizationOfBusinessLogic, OverUseOfPatterns, PathOfLeastResistance, ParsingHtmlWithRegex, PassingNullsToConstructors, PlugCompatibleInterchangeableEngineers, PoliticsOrientedArchitecture, PolterGeists, ReinventingTheWheel, ReinventTheWheel, RollYourOwnDatabase, RequirementsTossedOverTheWall, RubeGoldbergMachine, ScapeGoat, SeagullManagement, SecretSociety, SellingaProductYouCantRealize, ShootTheMessenger, SingleFunctionExitPoint, SmokeAndMirrors, SoftwareMerger, SpaghettiCode, SpecifyNothing, StandingOnTheShouldersOfMidgets, StovepipeAntiPattern, StringWithoutLength, SumoMarriage, SweepItUnderTheRugAntiPattern, SwissArmyKnife, ThatsNotReallyAnIssue, TheBlob, TheCustomersAreIdiots, TheGrandOldDukeOfYork, TheProcessIsTheDeliverable, TheyUnderstoodMe, ThrownOverTheWall, TowerOfVoodoo, TrainTheTrainer, UntestedButFinished, VendorLockIn, ViewgraphEngineering, VietnamWarAntiPattern, VoodooChickenCoding, WalkingThroughaMineField, WarmBodies, WeAreIdiots, WolfTicket, YetAnotherMeetingWillSolveIt, YetAnotherThreadWillSolveIt, ANTI-PATTERN
DESIGN FOR THE SAKE OF DESIGN “I only ship the perfection" ANTI PATTERNS
OVER ENGINEERING OVERUSE OF PATTERNS ANTI PATTERNS
THE BLOB BIG BALL OF MUD ANTI PATTERNS
GLOBALIZING STANDING ON THE SHOULDER OF THE MIDGETS ANTI PATTERNS
REINVENTING THE WHEEL NIH SYNDROME ANTI PATTERNS
E D O C SPAGHETTI WITHIMEATBALL L IO CODE LASAGNA V A R SPAGHETTI CODE
code spends more time being read and maintained than being created
DECOUPLE
DECOUPLE
DECOUPLE.
GOOD QUESTIONS ARE BETTER THAN GOOD ANSWERS
REFERENCES 1. https://gist.github.com/giorrrgio/d4395afe470a1ad223e0 2. http://12factor.net 3. http://obvioushints.blogspot.it/2008/12/symfony-design-patterns.html 4. http://c2.com/cgi/wiki?AntiPatternsCatalog 5. http://martinfowler.com/bliki/InversionOfControl.html 6. http://martinfowler.com/articles/injection.html

Design pattern in Symfony2 - Nanos gigantium humeris insidentes