SlideShare a Scribd company logo
© 2016 Magento, Inc. Page | 1
API Design
Best practices
Igor Miniailo
Magento 2 Architect
© 2016 Magento, Inc. Page | 2
© 2016 Magento, Inc. Page | 3
© 2016 Magento, Inc. Page | 4
Why is API so crucial?
© 2016 Magento, Inc. Page | 5
© 2016 Magento, Inc. Page | 6
© 2016 Magento, Inc. Page | 7
© 2016 Magento, Inc. Page | 8
Semantic Versioning
Version numbers are in the format
MAJOR.MINOR.PATCH, where:
– MAJOR indicates incompatible API changes
– MINOR indicates backward-compatible
functionality has been added
– PATCH indicates backward-compatible bug
fixes
© 2016 Magento, Inc. Page | 9
The backward compatibility policy
applies to PHP code annotated with
@api
© 2016 Magento, Inc. Page | 10
Public and Private code
© 2016 Magento, Inc. Page | 11
Public vs Private code
Private code is not supposed to
be used by third party modules,
so, in most cases, its
modifications will only trigger
PATCH version bumps.
Changes in public code always
trigger MINOR or MAJOR
version bumps.
© 2016 Magento, Inc. Page | 12
What examples of Public code Magento has?
• PHP Interface (marked with @api)
• PHP Class (marked with @api)
• Javascript Interface (marked with @api)
• Javascript Class (marked with @api)
• Virtual Type (marked with @api)
• URL paths
• Console commands and their arguments
• Less Variables & Mixins
• Message queue topics and their data types
• UI component declarations
• Layout handles declared by modules
• Events triggered by component (both static dynamic)
• Schema of configuration types introduced by module
• Structure of System Configuration fields used by module
© 2016 Magento, Inc. Page | 13
API vs SPI (Extension Points)
A PHP Interface in Magento can be used several ways by the core
product and extension developers.
• As an API. is a set of interfaces and their
implementations that a module provides to other
modules
• As a Service Provider Interface (SPI). is a set of
interfaces that a module uses internally and allows their
implementation by other modules.
• As both. APIs and SPIs are not mutually exclusive.
© 2016 Magento, Inc. Page | 14
After the code is released, both API and SPI can
be evolved in a backwards-compatible way. But
both have their specific limitations.
© 2016 Magento, Inc. Page | 15
© 2016 Magento, Inc. Page | 16
© 2016 Magento, Inc. Page | 17
© 2016 Magento, Inc. Page | 18
© 2016 Magento, Inc. Page | 19
© 2016 Magento, Inc. Page | 20
We do not distinguish them separately.
SPIs are annotated the same as APIs.
© 2016 Magento, Inc. Page | 21
Who decides whether interface/class belong to API or SPI?
YOU
© 2016 Magento, Inc. Page | 22
Dependency Rules API
If a module uses (calls) an API, it should be dependent on the MAJOR
version.
API dependency example
{
...
"require": {
"magento/module-customer": "~100.0", // (>=100.0 <101.0.0)
},
...
}
© 2016 Magento, Inc. Page | 23
Dependency Rules SPI
If a module implements an API/SPI, it should be dependent on the
MAJOR+MINOR version.
SPI dependency example
{
...
"require": {
"magento/module-customer": "~100.0.0", // (>=100.0.0 <100.1.0)
},
...
}
© 2016 Magento, Inc. Page | 24
http://devdocs.magento.com/guides/v2.1/release-notes/backward-
incompatible-changes-2.1.html
© 2016 Magento, Inc. Page | 25
Prohibited Code Changes
© 2016 Magento, Inc. Page | 26
• Interface/class removal
• Public & protected method removal
• Introduction of a method to a class or
interface
PHP - Prohibited Code Changes
© 2016 Magento, Inc. Page | 27
MagentoCatalogApiCategoryRepositoryInterface
© 2016 Magento, Inc. Page | 28
MagentoCatalogApiCategoryListInterface
© 2016 Magento, Inc. Page | 29
PHP - Prohibited Code Changes
• Static function removal
• Parameter addition in public methods
• Parameter addition in protected
methods
© 2016 Magento, Inc. Page | 30
© 2016 Magento, Inc. Page | 31
PHP - Prohibited Code Changes
• Method argument type modification
• Modification of types of thrown
exceptions (unless a new exception is
a subtype of the old one)
• Constructor modification
© 2016 Magento, Inc. Page | 32
class ExistingClass
{
/**
* @var NewDependencyInterface $newDependency
*/
private $newDependency;
public function __construct(
OldDependencyIntreface $oldDependency,
$oldRequiredConstructorParameter,
$oldOptinalConstructorParameter = null,
NewDependencyInterface $newDependency = null
) {
...
$this>newDependency = $newDependency ?: MagentoFrameworkAppObjectManager::getInstance()
->get(NewDependencyInterface::class);
...
}
public function existingFunction() {
// Existing functionality
...
// Use $this->newDependency wherever the new dependency is needed
...
}
}
© 2016 Magento, Inc. Page | 33
PHP - Prohibited Code Changes
• Modifying the default values of
optional arguments in public and
protected methods
• Removing or renaming constants
© 2016 Magento, Inc. Page | 34
The main rule is that backwards compatibility
is more important than niceness and effort of
the implementation.
© 2016 Magento, Inc. Page | 35
Coupling Between Objects Reaches Its Limit with
a New Dependency
© 2016 Magento, Inc. Page | 36
We MUST do continuous Refactoring!
Backward Compatibility should not be an excuse
for not doing refactoring!
© 2016 Magento, Inc. Page | 37
Backward Compatible Fix
*it works (most of the time), but code quality
is far from good enough
© 2016 Magento, Inc. Page | 38
Good object oriented programming in the service layer is basically
functional programming:
• constructor injection
• immutable state
• single responsibility principle
• uniform interfaces
• value objects passed across services
Bringing these concepts to an extreme leads to single-method,
immutable objects.
© 2016 Magento, Inc. Page | 39
© 2016 Magento, Inc. Page | 40
Why execute but not __invoke?
© 2016 Magento, Inc. Page | 41
PHP 7
• Return Types
• Scalar Type hinting
© 2016 Magento, Inc. Page | 42
Repositories
In Magento 2 Repositories are considered as an implementation
of Facade pattern which provides a simplified interface to a larger body
of code responsible for Domain Entity management.
The main intention is to make API more readable and reduce
dependencies of business logic code on the inner workings of a
module, since most code uses the facade, thus allowing more flexibility
in developing the system.
© 2016 Magento, Inc. Page | 43
Repositories
© 2016 Magento, Inc. Page | 44
© 2016 Magento, Inc. Page | 45
© 2016 Magento, Inc. Page | 46
Good API design
Don't make your client do anything you can do
for them (this reduces the amount of boilerplate
code your client will have)
© 2016 Magento, Inc. Page | 47
© 2016 Magento, Inc. Page | 48
Q & A
@iminyaylo
engcom@magent.com

More Related Content

What's hot (20)

PDF
Explaining API Integration: How Does API Integration work?
DavidAltmen
 
PDF
What do you mean by "API as a Product"?
Lou Powell
 
PDF
APIdays Paris 2019 - Zero Downtime in API Management by Waldemar Rosenfeld, A...
apidays
 
PDF
apidays LIVE London 2021 - Banking APIs Evolution by Hector Arias, BBVA
apidays
 
PDF
apidays LIVE Paris 2021 - 5 Learnings Shaping Our View on the Future of APIs ...
apidays
 
PDF
apidays LIVE Singapore 2021 - What financial services can learn from Marketpl...
apidays
 
PDF
apidays LIVE Australia 2021 - Composing a Headless and Composable Commerce Ar...
apidays
 
PPTX
apidays LIVE Paris - Marketplace API modernization: how to scale your busines...
apidays
 
PPTX
APIs for... Your Mom
Carlo Longino
 
PPTX
Mapping out your API Strategy - 4.20.11 Webinar slides
Apigee | Google Cloud
 
PPTX
API Strategy Introduction
Doug Gregory
 
PDF
APIdays Zurich 2019 - The Three Pillars of API Strategy Erik Wilde, GoodAPI
apidays
 
PDF
How APIs Transform Both Your Business and Technology
WSO2
 
PDF
APIdays Zurich 2019 - Boosting the Digital Transformation at UBS with APIs Ro...
apidays
 
PPT
apidays LIVE Helsinki & North - Bye bye to the insurance monolith - case Eule...
apidays
 
PPTX
Vizag Virtual Meetup #7: Trending API Topics for 2022
Ravi Tamada
 
PDF
APIdays Zurich 2019 - Digital Ecosystems, fueled by APIs Matthias Biehl, API ...
apidays
 
PPTX
APIdays Zurich 2019 - The experience of BBVA API Market David Ramos Lehnhoff,...
apidays
 
PDF
[WSO2 Summit EMEA 2020] Experiencing the Benefits of API Driven Open Banking
WSO2
 
PDF
apidays LIVE London 2021 - Presenting the Kubernetes Browser by Daria Muehlet...
apidays
 
Explaining API Integration: How Does API Integration work?
DavidAltmen
 
What do you mean by "API as a Product"?
Lou Powell
 
APIdays Paris 2019 - Zero Downtime in API Management by Waldemar Rosenfeld, A...
apidays
 
apidays LIVE London 2021 - Banking APIs Evolution by Hector Arias, BBVA
apidays
 
apidays LIVE Paris 2021 - 5 Learnings Shaping Our View on the Future of APIs ...
apidays
 
apidays LIVE Singapore 2021 - What financial services can learn from Marketpl...
apidays
 
apidays LIVE Australia 2021 - Composing a Headless and Composable Commerce Ar...
apidays
 
apidays LIVE Paris - Marketplace API modernization: how to scale your busines...
apidays
 
APIs for... Your Mom
Carlo Longino
 
Mapping out your API Strategy - 4.20.11 Webinar slides
Apigee | Google Cloud
 
API Strategy Introduction
Doug Gregory
 
APIdays Zurich 2019 - The Three Pillars of API Strategy Erik Wilde, GoodAPI
apidays
 
How APIs Transform Both Your Business and Technology
WSO2
 
APIdays Zurich 2019 - Boosting the Digital Transformation at UBS with APIs Ro...
apidays
 
apidays LIVE Helsinki & North - Bye bye to the insurance monolith - case Eule...
apidays
 
Vizag Virtual Meetup #7: Trending API Topics for 2022
Ravi Tamada
 
APIdays Zurich 2019 - Digital Ecosystems, fueled by APIs Matthias Biehl, API ...
apidays
 
APIdays Zurich 2019 - The experience of BBVA API Market David Ramos Lehnhoff,...
apidays
 
[WSO2 Summit EMEA 2020] Experiencing the Benefits of API Driven Open Banking
WSO2
 
apidays LIVE London 2021 - Presenting the Kubernetes Browser by Daria Muehlet...
apidays
 

Similar to API design best practices (20)

PPTX
API Design Best Practices by Igor Miniailo
Magecom UK Limited
 
PPTX
Igor Miniailo - Magento 2 API Design Best Practices
Atwix
 
PPTX
Backward Compatibility Developer's Guide Webinar
Igor Miniailo
 
PPTX
MageConf 2017, Design API Best Practices
Igor Miniailo
 
PPTX
Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
Elogic Magento Development
 
PPTX
Backward Compatibility Developer's Guide in Magento 2
Igor Miniailo
 
PPTX
Backwards Compatibility Developers Guide. #MM17NL
Igor Miniailo
 
PPTX
Backward Compatibility Developer's Guide in Magento 2. #MM17CZ
Igor Miniailo
 
PPTX
Magento Technical guidelines
Elogic Magento Development
 
PDF
Mli 2017 technical backward compatibility
Hanoi MagentoMeetup
 
PPTX
Valeriy Nayda - Best Practices in Magento 2. Based on Multi Source Inventory ...
Atwix
 
PDF
Chernivtsi Magento Meetup&Contribution day. Naida V.
Elogic Magento Development
 
PPTX
Applying Code Customizations to Magento 2
Igor Miniailo
 
PDF
Magento 2 Seminar - Roger Keulen - Machine learning
Yireo
 
PPTX
Code Generation in Magento 2
Sergii Shymko
 
PPT
Meet Magento Belarus - Elena Leonova
Amasty
 
PPTX
Testing in Magento 2
Igor Miniailo
 
PDF
Oleksii Korshenko - Magento 2 Backwards Compatible Policy
Meet Magento Italy
 
PPTX
Awesome Architectures in Magento 2.3
Riccardo Tempesta
 
PPT
Meet Magento Belarus - Magento2: What to expect and when? - Elena Leonova
Elena Leonova
 
API Design Best Practices by Igor Miniailo
Magecom UK Limited
 
Igor Miniailo - Magento 2 API Design Best Practices
Atwix
 
Backward Compatibility Developer's Guide Webinar
Igor Miniailo
 
MageConf 2017, Design API Best Practices
Igor Miniailo
 
Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
Elogic Magento Development
 
Backward Compatibility Developer's Guide in Magento 2
Igor Miniailo
 
Backwards Compatibility Developers Guide. #MM17NL
Igor Miniailo
 
Backward Compatibility Developer's Guide in Magento 2. #MM17CZ
Igor Miniailo
 
Magento Technical guidelines
Elogic Magento Development
 
Mli 2017 technical backward compatibility
Hanoi MagentoMeetup
 
Valeriy Nayda - Best Practices in Magento 2. Based on Multi Source Inventory ...
Atwix
 
Chernivtsi Magento Meetup&Contribution day. Naida V.
Elogic Magento Development
 
Applying Code Customizations to Magento 2
Igor Miniailo
 
Magento 2 Seminar - Roger Keulen - Machine learning
Yireo
 
Code Generation in Magento 2
Sergii Shymko
 
Meet Magento Belarus - Elena Leonova
Amasty
 
Testing in Magento 2
Igor Miniailo
 
Oleksii Korshenko - Magento 2 Backwards Compatible Policy
Meet Magento Italy
 
Awesome Architectures in Magento 2.3
Riccardo Tempesta
 
Meet Magento Belarus - Magento2: What to expect and when? - Elena Leonova
Elena Leonova
 
Ad

More from Igor Miniailo (16)

PPTX
Extensibility of Magento, the look into the future
Igor Miniailo
 
PPTX
Magento Storefront architecture
Igor Miniailo
 
PPTX
Something Architecture
Igor Miniailo
 
PPTX
A long way from Monolith to Service Isolated Architecture #MM19NL
Igor Miniailo
 
PPTX
The long way from Monolith to Microservices
Igor Miniailo
 
PPTX
CQRS and Event-Sourcing in Magento2 by examples of MSI
Igor Miniailo
 
PPTX
Multi-Source Inventory. Imagine. Las Vegas. 2018
Igor Miniailo
 
PPTX
Magento Multi-Source Inventory (MSI)
Igor Miniailo
 
PPTX
Magento 2 Automated Testing via examples of Multi-Source Inventory (MSI)
Igor Miniailo
 
PPTX
Architecture and workflow of Multi-Source Inventory
Igor Miniailo
 
PPTX
Dare to Share Magento Community Engineering
Igor Miniailo
 
PPTX
Multi Source Inventory (MSI) in Magento 2
Igor Miniailo
 
PPTX
Magento Developer Talk. Microservice Architecture and Actor Model
Igor Miniailo
 
PPTX
Modular development in Magento 2
Igor Miniailo
 
PPTX
Мониторинг веб приложений на PHP в режиме реального времени с помощью Pinba. ...
Igor Miniailo
 
PPTX
Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет
Igor Miniailo
 
Extensibility of Magento, the look into the future
Igor Miniailo
 
Magento Storefront architecture
Igor Miniailo
 
Something Architecture
Igor Miniailo
 
A long way from Monolith to Service Isolated Architecture #MM19NL
Igor Miniailo
 
The long way from Monolith to Microservices
Igor Miniailo
 
CQRS and Event-Sourcing in Magento2 by examples of MSI
Igor Miniailo
 
Multi-Source Inventory. Imagine. Las Vegas. 2018
Igor Miniailo
 
Magento Multi-Source Inventory (MSI)
Igor Miniailo
 
Magento 2 Automated Testing via examples of Multi-Source Inventory (MSI)
Igor Miniailo
 
Architecture and workflow of Multi-Source Inventory
Igor Miniailo
 
Dare to Share Magento Community Engineering
Igor Miniailo
 
Multi Source Inventory (MSI) in Magento 2
Igor Miniailo
 
Magento Developer Talk. Microservice Architecture and Actor Model
Igor Miniailo
 
Modular development in Magento 2
Igor Miniailo
 
Мониторинг веб приложений на PHP в режиме реального времени с помощью Pinba. ...
Igor Miniailo
 
Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет
Igor Miniailo
 
Ad

Recently uploaded (20)

PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PPTX
Tally software_Introduction_Presentation
AditiBansal54083
 
PPTX
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
PPTX
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
Linux Certificate of Completion - LabEx Certificate
VICTOR MAESTRE RAMIREZ
 
PPTX
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PDF
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
PDF
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
PPTX
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
PDF
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
PPTX
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
PDF
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
PDF
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 
PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
PPTX
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
PDF
HiHelloHR – Simplify HR Operations for Modern Workplaces
HiHelloHR
 
PPTX
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
PPTX
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
Tally software_Introduction_Presentation
AditiBansal54083
 
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Linux Certificate of Completion - LabEx Certificate
VICTOR MAESTRE RAMIREZ
 
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
HiHelloHR – Simplify HR Operations for Modern Workplaces
HiHelloHR
 
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 

API design best practices

  • 1. © 2016 Magento, Inc. Page | 1 API Design Best practices Igor Miniailo Magento 2 Architect
  • 2. © 2016 Magento, Inc. Page | 2
  • 3. © 2016 Magento, Inc. Page | 3
  • 4. © 2016 Magento, Inc. Page | 4 Why is API so crucial?
  • 5. © 2016 Magento, Inc. Page | 5
  • 6. © 2016 Magento, Inc. Page | 6
  • 7. © 2016 Magento, Inc. Page | 7
  • 8. © 2016 Magento, Inc. Page | 8 Semantic Versioning Version numbers are in the format MAJOR.MINOR.PATCH, where: – MAJOR indicates incompatible API changes – MINOR indicates backward-compatible functionality has been added – PATCH indicates backward-compatible bug fixes
  • 9. © 2016 Magento, Inc. Page | 9 The backward compatibility policy applies to PHP code annotated with @api
  • 10. © 2016 Magento, Inc. Page | 10 Public and Private code
  • 11. © 2016 Magento, Inc. Page | 11 Public vs Private code Private code is not supposed to be used by third party modules, so, in most cases, its modifications will only trigger PATCH version bumps. Changes in public code always trigger MINOR or MAJOR version bumps.
  • 12. © 2016 Magento, Inc. Page | 12 What examples of Public code Magento has? • PHP Interface (marked with @api) • PHP Class (marked with @api) • Javascript Interface (marked with @api) • Javascript Class (marked with @api) • Virtual Type (marked with @api) • URL paths • Console commands and their arguments • Less Variables & Mixins • Message queue topics and their data types • UI component declarations • Layout handles declared by modules • Events triggered by component (both static dynamic) • Schema of configuration types introduced by module • Structure of System Configuration fields used by module
  • 13. © 2016 Magento, Inc. Page | 13 API vs SPI (Extension Points) A PHP Interface in Magento can be used several ways by the core product and extension developers. • As an API. is a set of interfaces and their implementations that a module provides to other modules • As a Service Provider Interface (SPI). is a set of interfaces that a module uses internally and allows their implementation by other modules. • As both. APIs and SPIs are not mutually exclusive.
  • 14. © 2016 Magento, Inc. Page | 14 After the code is released, both API and SPI can be evolved in a backwards-compatible way. But both have their specific limitations.
  • 15. © 2016 Magento, Inc. Page | 15
  • 16. © 2016 Magento, Inc. Page | 16
  • 17. © 2016 Magento, Inc. Page | 17
  • 18. © 2016 Magento, Inc. Page | 18
  • 19. © 2016 Magento, Inc. Page | 19
  • 20. © 2016 Magento, Inc. Page | 20 We do not distinguish them separately. SPIs are annotated the same as APIs.
  • 21. © 2016 Magento, Inc. Page | 21 Who decides whether interface/class belong to API or SPI? YOU
  • 22. © 2016 Magento, Inc. Page | 22 Dependency Rules API If a module uses (calls) an API, it should be dependent on the MAJOR version. API dependency example { ... "require": { "magento/module-customer": "~100.0", // (>=100.0 <101.0.0) }, ... }
  • 23. © 2016 Magento, Inc. Page | 23 Dependency Rules SPI If a module implements an API/SPI, it should be dependent on the MAJOR+MINOR version. SPI dependency example { ... "require": { "magento/module-customer": "~100.0.0", // (>=100.0.0 <100.1.0) }, ... }
  • 24. © 2016 Magento, Inc. Page | 24 http://devdocs.magento.com/guides/v2.1/release-notes/backward- incompatible-changes-2.1.html
  • 25. © 2016 Magento, Inc. Page | 25 Prohibited Code Changes
  • 26. © 2016 Magento, Inc. Page | 26 • Interface/class removal • Public & protected method removal • Introduction of a method to a class or interface PHP - Prohibited Code Changes
  • 27. © 2016 Magento, Inc. Page | 27 MagentoCatalogApiCategoryRepositoryInterface
  • 28. © 2016 Magento, Inc. Page | 28 MagentoCatalogApiCategoryListInterface
  • 29. © 2016 Magento, Inc. Page | 29 PHP - Prohibited Code Changes • Static function removal • Parameter addition in public methods • Parameter addition in protected methods
  • 30. © 2016 Magento, Inc. Page | 30
  • 31. © 2016 Magento, Inc. Page | 31 PHP - Prohibited Code Changes • Method argument type modification • Modification of types of thrown exceptions (unless a new exception is a subtype of the old one) • Constructor modification
  • 32. © 2016 Magento, Inc. Page | 32 class ExistingClass { /** * @var NewDependencyInterface $newDependency */ private $newDependency; public function __construct( OldDependencyIntreface $oldDependency, $oldRequiredConstructorParameter, $oldOptinalConstructorParameter = null, NewDependencyInterface $newDependency = null ) { ... $this>newDependency = $newDependency ?: MagentoFrameworkAppObjectManager::getInstance() ->get(NewDependencyInterface::class); ... } public function existingFunction() { // Existing functionality ... // Use $this->newDependency wherever the new dependency is needed ... } }
  • 33. © 2016 Magento, Inc. Page | 33 PHP - Prohibited Code Changes • Modifying the default values of optional arguments in public and protected methods • Removing or renaming constants
  • 34. © 2016 Magento, Inc. Page | 34 The main rule is that backwards compatibility is more important than niceness and effort of the implementation.
  • 35. © 2016 Magento, Inc. Page | 35 Coupling Between Objects Reaches Its Limit with a New Dependency
  • 36. © 2016 Magento, Inc. Page | 36 We MUST do continuous Refactoring! Backward Compatibility should not be an excuse for not doing refactoring!
  • 37. © 2016 Magento, Inc. Page | 37 Backward Compatible Fix *it works (most of the time), but code quality is far from good enough
  • 38. © 2016 Magento, Inc. Page | 38 Good object oriented programming in the service layer is basically functional programming: • constructor injection • immutable state • single responsibility principle • uniform interfaces • value objects passed across services Bringing these concepts to an extreme leads to single-method, immutable objects.
  • 39. © 2016 Magento, Inc. Page | 39
  • 40. © 2016 Magento, Inc. Page | 40 Why execute but not __invoke?
  • 41. © 2016 Magento, Inc. Page | 41 PHP 7 • Return Types • Scalar Type hinting
  • 42. © 2016 Magento, Inc. Page | 42 Repositories In Magento 2 Repositories are considered as an implementation of Facade pattern which provides a simplified interface to a larger body of code responsible for Domain Entity management. The main intention is to make API more readable and reduce dependencies of business logic code on the inner workings of a module, since most code uses the facade, thus allowing more flexibility in developing the system.
  • 43. © 2016 Magento, Inc. Page | 43 Repositories
  • 44. © 2016 Magento, Inc. Page | 44
  • 45. © 2016 Magento, Inc. Page | 45
  • 46. © 2016 Magento, Inc. Page | 46 Good API design Don't make your client do anything you can do for them (this reduces the amount of boilerplate code your client will have)
  • 47. © 2016 Magento, Inc. Page | 47
  • 48. © 2016 Magento, Inc. Page | 48 Q & A @iminyaylo [email protected]

Editor's Notes

  • #9: We promise to be backward compatible for classes and methods annotated with @api within MINOR and PATCH updates to our components. As changes are introduced, we annotate methods with @deprecated. The methods are removed only with the next MAJOR component version. 
  • #12: Let’s recap what we had with Magento 1 – where everything is an extension points. All the protected mess and so on. We can’t make changes in contract – all changes suppose to extend existing contract.
  • #23: Tilde = Significant Release Operator