Nanos gigantium humeris insidentes (design patterns inside symfony 2)

3,771 views

Published on

Talk presented by me and Giulio De Donato at SymfonyDayIt 2013

Published in: Technology

Nanos gigantium humeris insidentes (design patterns inside symfony 2)

  1. 1. DESIGN PATTERNS INSIDE SYMFONY2 Nanos gigantium humeris insidentes
  2. 2. GIANTS
  3. 3. liurrrgio GIORGIO CEFARO @giorrrgio GIULIO DE DONATO @liuggio
  4. 4. DESIGN PATTERN?
  5. 5. A solution of a problem in a context James O. Coplien (1994) DESIGN PATTERN
  6. 6. “ For me a pattern is primarily a way to chunk up advice about a topic “ DESIGN PATTERN
  7. 7. #1
  8. 8. INTENT: A controller that handles all requests for a Web site FRONT CONTROLLER
  9. 9. FRONT CONTROLLER web/app.php
  10. 10. FRONT CONTROLLER ... and ? web/app.php
  11. 11. INTENT: Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. DECORATOR
  12. 12. DECORATOR SymfonyComponentHttpKernelHttpCacheHttpCache
  13. 13. U DUNNO HttpKernelInterface? SymfonyComponentHttpKernelHttpKernelInterface
  14. 14. KERNEL AND SERVICE CONTAINER SymfonyComponentHttpKernelKernel
  15. 15. INVERSION OF CONTROL INTENT: Inversion of control is a style of software construction where reusable code controls the execution of problem-specific code
  16. 16. 1988 INVERSION OF CONTROL
  17. 17. “ 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.”
  18. 18. “ DON’T CALL US WE’LL CALL YOU ” INVERSION OF CONTROL HOLLYWOOD PRINCIPLE:
  19. 19. INVERSION OF CONTROL
  20. 20. "Dependency Injection is where components are given their dependencies through their constructors, methods, or directly into fields." PICO CONTAINER DEFINITION:
  21. 21. Dependency injection allows the removal of hard-coded dependencies and makes it possible to change them, whether at run-time or compile- time.
  22. 22. INJECTING A TRANSPORT INSIDE A MAILER
  23. 23. - FIGHT OF THE DAY - SERVICE CONTAINER vs DEPENDENCY INJECTION
  24. 24. INVERSION OF CONTROL INTENT: DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPLE DECOUPL DECOUPLE DECOUPLE
  25. 25. ?? DEPENDENCY INJECTION AND FRAMEWORKS 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) DI DIC http://www.loosecouplings.com/2011/01/dependency-injection-using-di-container.html
  26. 26. 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
  27. 27. FACTORY METHOD - DO IT WITH THE DIC
  28. 28. INTENT: Provide an interface for creating families of related or dependent objects without specifying their concrete classes. ABSTRACT FACTORY
  29. 29. ABSTRACT FACTORY - SecurityFactoryInterface SymfonyBundleSecurityBundleDependencyInjectionSecurityFactorySecurityFactoryInterface
  30. 30. INTENT: Separate the construction of a complex object from its representation so that the same construction process can create different representations. BUILDER
  31. 31. FORM BUILDER SymfonyComponentFormFormBuilderInterface
  32. 32. FORM BUILDER
  33. 33. INTENT: Provide a surrogate or placeholder for another object to control access to it. PROXY
  34. 34. DOCTRINE PROXY app/cache/doctrine/odm/Proxies/ ...
  35. 35. 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. MEDIATOR
  36. 36. MEDIATOR RouterListener Kernel :: REQUEST EVENT DISPATCHERSessionListener Firewall LocaleListener ProfilerListener FragmentListener
  37. 37. INTENT: Defines a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. STRATEGY aka POLICY
  38. 38. FragmentRendererInterface SymfonyComponentHttpKernelFragmentFragmentRendererInterface
  39. 39. Fragment Renderers SymfonyComponentHttpKernelFragment...
  40. 40. INTENT: A layer of Mappers that moves data between objects and a database while keeping them independent of each other and the mapper itself. DATA MAPPER
  41. 41. 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. VISITOR
  42. 42. VALIDATION VISITOR SymfonyComponentValidator..
  43. 43. MVC Controller View Model
  44. 44. ANTI-PATTERNANTI-PATTERNANTI-PATTERN 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,
  45. 45. ANTI PATTERNS DESIGN FOR THE SAKE OF DESIGN “I only ship the perfection"
  46. 46. ANTI PATTERNS OVER ENGINEERING OVERUSE OF PATTERNS
  47. 47. ANTI PATTERNS THE BLOB BIG BALL OF MUD
  48. 48. ANTI PATTERNS GLOBALIZING STANDING ON THE SHOULDER OF THE MIDGETS
  49. 49. ANTI PATTERNS REINVENTING THE WHEEL NIH SYNDROME
  50. 50. SPAGHETTI CODE SPAGHETTI WITH MEATBALL LASAGNA CODE RAVIOLI CODE RAVIOLI CODE
  51. 51. code spends more time being read and maintained than being created
  52. 52. DECOUPLE
  53. 53. DECOUPLE
  54. 54. DECOUPLE.
  55. 55. GOOD QUESTIONS ARE BETTER THAN GOOD ANSWERS
  56. 56. 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 REFERENCES

×