OOP & Design Pattern - Algiers Developers Meetup August 2015

Tarik Zakaria Benmerar
Tarik Zakaria BenmerarCEO and Founder at Acigna Inc. em Emploitic.com
OOP
&
DESIGN PATTERN
Tarik Zakaria Benmerar
Acigna Inc.
OOP & Design Pattern - Algiers Developers Meetup August 2015
LES PRINCIPES DE LA
CONCEPTION DES
LOGICIELS
DRY
( DON’T REPEAT YOURSELF )
Chaque connaissance dans le système doit avoir une représentation unique
et non ambigüe.
DRY:
• Réutilisez du code, ne le dupliquez pas.
• Choisissez des noms clairs.
• Choisissez le bon endroit pour le code.
DRY: <?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
DRY: <?php
function retrieveGuests( $conn ) {
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql),
$resultArr = [];
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$resultArr[] = $row;
}
}
return $resulArr;
}
?>
Le code sera placée dans guests/models.php
SRP
( SINGLE RESPONSABILITY
PRINCIPLE )
Chaque code doit avoir une seule responsabilité. Le code doit être cohésive.
SRP: <?php
$conn = getConnection();
$guests = retrieveGuests( $conn );
showGuests( $guests );
closConnection( $conn );
?>
----------------------------------------------------------------------
<?php
function showGuests( $guests ) {
if( count( $guests ) ) {
for( $i = 0; $i < count( $guests ); $i++ ) {
$row = $guests[ i ];
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
}
?>
TDA
( TELL DON’T ASK )
Déclarez des actions, au lieu de se poser des questions.
TDA: ----------------------------------------------------------------------
<?php
function showGuests( $guests ) {
if( count( $guests ) ) {
foreach( $guests as $row ) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
}
?>
-----------------------------------------------------------------------
var numbers = [….];
numbers.some(function ( number ) {
return !numbers % 2;
});
YAGNI
( YOU AREN’T GONNA NEED IT YET )
Ecrivez du code que vous avez besoin maintenant.
OCP
( OPEN CLOSE PRINCIPLE )
Ouvert pour l’extensibilité. Fermé pour la modification.
LSP
( LISKOV’S SUBTITUTION PRINCIPLE )
Utilisez l’héritage seulement si vous signifiez la substitution des deux
classes (parent et fils).
LSP:
<?php
class Rectangle {
private $topLeft;
private $width;
private $height;
public function setHeight($height) {
$this->height = $height;
}
public function getHeight() {
return $this->height;
}
public function setWidth($width) {
$this->width = $width;
}
public function getWidth() {
return $this->width;
}
public function area() {
return $this->width * $this->height;
}
}
?>
<?php
class Square extends Rectangle {
public function setHeight($height) {
$this->height = $height;
$this->widget = $height;
}
public function setWidth($width) {
$this->width = $width;
$this->height = $width;
}
}
?>
<?php
class Square {
private $rectangle
public function setSide( $side ) {
$this->rectangle->setWidth( $side );
$this->rectangle->setHeight( $side );
}
public function area() {
return $this->rectangle->area();
}
}
?>
DIP
( DEPENDENCY INVERSION
PRINCIPLE )
Inversement du contrôle des dépendances.
DIP: <?php
class Square {
private $rectangle
public function _construct() {
$this->rectangle = new Rectangle();
}
public function setSide( $side ) {
$this->rectangle->setWidth( $side );
$this->rectangle->setHeight( $side );
}
public function area() {
return $this->rectangle->Area();
}
}
?>
<?php
class Square {
private $rectangle
public function _construct( $rectangle ) {
$this->rectangle = $rectangle;
}
public function setSide( $side ) {
$this->rectangle->setWidth( $side );
$this->rectangle->setHeight( $side );
}
public function area() {
return $this->rectangle->Area();
}
}
?>
LE DESIGN PATTERN
DESIGN
PATTERN:
• Recettes prêtes pour des problèmes de
programmation orienté objet (Qui
répondent aux principes déjà discutés).
• Reutilisation de code : pas de
reinvention de la rue.
• Assurer un langage commun.
• Applicable à un contexte.
DESIGN
PATTERN:
• 23 patterns
classiques.
3 CATÉGORIES DE
PATTERNS
• Créationnel.
• Instanciation d’objets.
• Structurel.
• Structures larges
d’objets et de classes.
• Comportemental.
• Interaction et distribution
de responsabilités.
DESIGN PATTERNS
CRÉATIONNELS:
• Factory : Créer des objets sans exposer la logique
d’instanciation.
• Abstract Factory : Encapsulation d’une famille de factories
qui produit des familles d’objets.
• Builder : Séparation de la construction d’un objet complexe
de sa représentation.
• Singleton : Assurer qu’une seule instance d’une classe
existe tout en fournissant une seule méthode pour accéder
cette instance.
• Prototype : Créer une instance initialisée pour clonage.
• Object Pool : Réutilisation et partage d’objets coûteux à
créer.
DESIGN PATTERNS
STRUCTURELS:
• Adapter : Adapter une interface à une autre incompatible.
• Bridge : Séparer l’abstraction de l’implémentation.
• Composite : Composer les objets dans une structure
d’arbres.
• Decorator : Ajouter de nouveaux comportements de façon
dynamique ou statiques.
• Facade : Simplifier l’utilisation en définissant une interface
de haut niveau.
• Flyweight : Partager une partie des états d’objets.
• Proxy : Créer une référence à un autre objet (pouvant être
distant).
DESIGN PATTERNS
COMPORTEMENTAUX:
• Chaine de Responsabilité : Définir une méthode pour faire
passer une requête à travers une chaine d’objets.
• Commande : Encapsuler une requête type commande dans
un objet.
• Interpreter : Spécifier comment interpréter un langage.
• Iterator : Accéder aux éléments d’une conteneur.
• Mediator : Centralisation du mécanisme de communication
entre les objets.
• Memento : Permettre la récupération des états antérieurs.
• Observer : Notifier plusieurs objets du changement d’état
d’un objet particulier.
DESIGN PATTERNS
COMPORTEMENTAUX:
• State : Encapsuler différents comportements pour la même
routine en se basant sur l’état de l’objet.
• Strategy : Séparer l’implémentation de l’algorithme de son
utilisation.
• Template Method : Définir le squelette d’un algorithme
dans une opération, différer certaines étapes dans les sous-
classes.
• Visitor : Séparer un algorithme de la structure d’objet sur
lequel il opère.
• Null Object : Définir un objet avec un comportement neutre.
TOUT CELA EST BIEN, MAIS
CE N’EST QUE LE DÉBUT DE
L’HISTOIRE……
LE DESIGN EMERGEANT
(ET ARCHITECTURE
ÉVOLUTIONNAIRE)
LE DESIGN EMERGEANT:
• On ne peut pas prévoir les design patterns à utiliser, on les
découvre.
• Les patterns présentés sont de nature technique, alors qu’il
existe des patterns du domaine.
• Le logiciel en lui-même change d’objectif et de structure, de
fait de plusieurs facteurs de l’environnement.
PRÉPARER L’ÉMERGENCE DU
DESIGN:
• Le code doit être expressif.
• Les responsables de l’architecture doivent coder eux aussi.
• Séparer l’architecture (difficile à changer) du design (assez
flexible pour être changé).
• Les décisions définitives de la conception doivent être faits
le plus tard possible.
• Choisissez un framework qui est découplé et qui respecte
les principes de la bonne conception.
• Comprendre le domaine d’étude.
• Adopter le TDD (Un programme difficile à tester implique à
un certain niveau une mauvaise conception).
Extracted vs. preemptive frameworks
The best frameworks tend to be those extracted from working code rather than
preemptively designed. Someone sitting down to design a framework must anticipate all
the ways developers might want to use it. The framework ends up including lots of
features, with a high chance that any given user won't use all of them. But you still must
take the unused features of your chosen framework into account, because they add to your
applications' accidental complexity; this could mean doing something as simple as making
extra entries in a configuration document, or as intrusive as changing the way you'd like to
implement a feature. Preemptive frameworks tend to be giant buckets of features, with
other (unanticipated) features left out. JavaServer Faces (JSF) is a classic example of a
preemptive framework. One of its cool features is the ability to plug in different rendering
pipelines, in case you want to emit a format other than HTML. Although this feature is
used rarely, all JSF users must understand its impact on a JSF request's life cycle.
Frameworks that grow from working applications tend to offer a more pragmatic set of
features, because they address the actual problems someone faced when writing an
application.
Extracted frameworks tend to have fewer extraneous features. Contrast a preemptive
framework like JSF with an extracted framework like Ruby on Rails, which has grown
from actual usage.
LE PATTERN DU DOMAINE
(ANALYSIS PATTERN)
• Les Designs Patterns répondent à des problématiques
purement techniques, et peuvent éventuellement
s’appliquer à une conception d’un domaine d’étude (Finance,
Sport, Recrutement, etc. ou Conception Orientée Domaine).
• Les Patterns du domaine reflètent des concepts profondes
émergeant du domaine.
PATTERN DU DOMAINE :
MODÈLE DE COMPTABILITÉ AVEC UN
SYSTÈME DE TRANSACTION
DOMAIN SPECIFIC LANGUAGE
• Language réduit pour définir et générer un modèle.
• S’applique dans un cadre particulier du domaine.
• Communique plus clairement l’objectif d’une partie du
système.
• Améliore la communication avec les experts du domaine.
• Constitue un modèle alternative à une conception purement
orientée objet.
• Exemples :
• Grammaire d’un langage de programmation.
• Automate à été fini.
DOMAIN SPECIFIC LANGUAGE :
OOP & Design Pattern - Algiers Developers Meetup August 2015
QUELQUES CLASSIQUES À
LIRE !
• Evolutionary Architecture And Emergent design, Neal Ford.
IBM Developer Works.
http://www.ibm.com/developerworks/views/java/libraryview.js
p?site_id=1&contentarea_by=Java&sort_by=Date&sort_order
=1&start=1&end=19&topic_by=&product_by=&type_by=All%
20Types&show_abstract=true&search_by=evolutionary%20ar
chitecture%20emergent%20design:&industry_by=&series_titl
e_by=
1 de 38

Recomendados

Design patterns et Design Emergeant - Micro Days - Modern Software Developmen... por
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Tarik Zakaria Benmerar
1.2K visualizações29 slides
Programmation orientée objet en PHP 5 por
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Kristen Le Liboux
14K visualizações69 slides
Php 2 - Approfondissement MySQL, PDO et MVC por
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
3.9K visualizações79 slides
Cours JavaScript por
Cours JavaScriptCours JavaScript
Cours JavaScriptOlivier Le Goaër
8.8K visualizações66 slides
CocoaHeads Toulouse - Getting to the core of Core Data por
CocoaHeads Toulouse - Getting to the core of Core DataCocoaHeads Toulouse - Getting to the core of Core Data
CocoaHeads Toulouse - Getting to the core of Core DataCocoaHeads France
1.9K visualizações75 slides
Cours php & Mysql - 4éme partie por
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partiekadzaki
2.6K visualizações28 slides

Mais conteúdo relacionado

Mais procurados

CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert por
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeadsRNS
2.1K visualizações39 slides
php2 : formulaire-session-PDO por
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
1.9K visualizações25 slides
Jpa Spring Hibernate por
Jpa Spring HibernateJpa Spring Hibernate
Jpa Spring Hibernatezaheryamak
2.6K visualizações50 slides
Javascript pour le développeur Java por
Javascript pour le développeur JavaJavascript pour le développeur Java
Javascript pour le développeur Javajollivetc
1.6K visualizações249 slides
Web-In 2010: Programmation Native iOS (French) por
Web-In 2010: Programmation Native iOS (French)Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)Fred Brunel
1.4K visualizações28 slides
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien! por
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!bleporini
1.4K visualizações11 slides

Mais procurados(12)

CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert por CocoaHeadsRNS
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeadsRNS2.1K visualizações
php2 : formulaire-session-PDO por Abdoulaye Dieng
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
Abdoulaye Dieng1.9K visualizações
Jpa Spring Hibernate por zaheryamak
Jpa Spring HibernateJpa Spring Hibernate
Jpa Spring Hibernate
zaheryamak2.6K visualizações
Javascript pour le développeur Java por jollivetc
Javascript pour le développeur JavaJavascript pour le développeur Java
Javascript pour le développeur Java
jollivetc1.6K visualizações
Web-In 2010: Programmation Native iOS (French) por Fred Brunel
Web-In 2010: Programmation Native iOS (French)Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)
Fred Brunel1.4K visualizações
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien! por bleporini
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
bleporini1.4K visualizações
Analyse statique et applications por Damien Seguy
Analyse statique et applicationsAnalyse statique et applications
Analyse statique et applications
Damien Seguy121 visualizações
Jpa(1) por Assad Lion
Jpa(1)Jpa(1)
Jpa(1)
Assad Lion1.6K visualizações
Un exemple élémentaire d'application MVC en PHP por Kristen Le Liboux
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHP
Kristen Le Liboux57.7K visualizações
Qui a laissé son mot de passe dans le code por Damien Seguy
Qui a laissé son mot de passe dans le codeQui a laissé son mot de passe dans le code
Qui a laissé son mot de passe dans le code
Damien Seguy214 visualizações
CocoaHeads Rennes #13 : Magical Record por CocoaHeadsRNS
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical Record
CocoaHeadsRNS5.2K visualizações
Ce bon vieux propel por Francois Zaninotto
Ce bon vieux propelCe bon vieux propel
Ce bon vieux propel
Francois Zaninotto1.5K visualizações

Destaque

Beyond design patterns phpnw14 por
Beyond design patterns   phpnw14Beyond design patterns   phpnw14
Beyond design patterns phpnw14Anthony Ferrara
4.4K visualizações75 slides
Design Patterns - Abstract Factory Pattern por
Design Patterns - Abstract Factory PatternDesign Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory PatternMudasir Qazi
4.5K visualizações15 slides
Organization in the visual arts por
Organization in the visual  artsOrganization in the visual  arts
Organization in the visual artsEric Pazziuagan
16.6K visualizações13 slides
humanities principle of visual art por
humanities principle of visual arthumanities principle of visual art
humanities principle of visual artayacastillo25
14.1K visualizações95 slides
Organization in the visual arts and Principles of Design por
Organization in the visual arts and Principles of DesignOrganization in the visual arts and Principles of Design
Organization in the visual arts and Principles of DesignMariz Ombajin
29.9K visualizações58 slides
Factory Pattern por
Factory PatternFactory Pattern
Factory PatternDeepti C
229 visualizações14 slides

Destaque(8)

Beyond design patterns phpnw14 por Anthony Ferrara
Beyond design patterns   phpnw14Beyond design patterns   phpnw14
Beyond design patterns phpnw14
Anthony Ferrara4.4K visualizações
Design Patterns - Abstract Factory Pattern por Mudasir Qazi
Design Patterns - Abstract Factory PatternDesign Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory Pattern
Mudasir Qazi4.5K visualizações
Organization in the visual arts por Eric Pazziuagan
Organization in the visual  artsOrganization in the visual  arts
Organization in the visual arts
Eric Pazziuagan16.6K visualizações
humanities principle of visual art por ayacastillo25
humanities principle of visual arthumanities principle of visual art
humanities principle of visual art
ayacastillo2514.1K visualizações
Organization in the visual arts and Principles of Design por Mariz Ombajin
Organization in the visual arts and Principles of DesignOrganization in the visual arts and Principles of Design
Organization in the visual arts and Principles of Design
Mariz Ombajin29.9K visualizações
Factory Pattern por Deepti C
Factory PatternFactory Pattern
Factory Pattern
Deepti C229 visualizações
The Elements of Visual Arts and Performing Arts por clxrisse
The Elements of Visual Arts and Performing ArtsThe Elements of Visual Arts and Performing Arts
The Elements of Visual Arts and Performing Arts
clxrisse122.1K visualizações
ARTS - Mediums of the Visual Arts: Painting, Sculpture and Architecture por Jewel Jem
ARTS - Mediums of the Visual Arts: Painting, Sculpture and ArchitectureARTS - Mediums of the Visual Arts: Painting, Sculpture and Architecture
ARTS - Mediums of the Visual Arts: Painting, Sculpture and Architecture
Jewel Jem97.7K visualizações

Similar a OOP & Design Pattern - Algiers Developers Meetup August 2015

DesignPatternsISI.pdf por
DesignPatternsISI.pdfDesignPatternsISI.pdf
DesignPatternsISI.pdfandre543581
9 visualizações98 slides
Design patterns - Exemples en Java por
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en JavaOussama BEN KHIROUN
3.7K visualizações25 slides
Qualité de code et bonnes pratiques por
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesECAM Brussels Engineering School
4K visualizações42 slides
Sql azure performance et montee en charge (1) por
Sql azure   performance et montee en charge (1)Sql azure   performance et montee en charge (1)
Sql azure performance et montee en charge (1)Aymeric Weinbach
774 visualizações36 slides
Mappingobjetrelationnel[1] por
Mappingobjetrelationnel[1]Mappingobjetrelationnel[1]
Mappingobjetrelationnel[1]linasafaa
556 visualizações47 slides
Qualité logicielle por
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
1.4K visualizações82 slides

Similar a OOP & Design Pattern - Algiers Developers Meetup August 2015(20)

DesignPatternsISI.pdf por andre543581
DesignPatternsISI.pdfDesignPatternsISI.pdf
DesignPatternsISI.pdf
andre5435819 visualizações
Design patterns - Exemples en Java por Oussama BEN KHIROUN
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
Oussama BEN KHIROUN3.7K visualizações
Sql azure performance et montee en charge (1) por Aymeric Weinbach
Sql azure   performance et montee en charge (1)Sql azure   performance et montee en charge (1)
Sql azure performance et montee en charge (1)
Aymeric Weinbach774 visualizações
Mappingobjetrelationnel[1] por linasafaa
Mappingobjetrelationnel[1]Mappingobjetrelationnel[1]
Mappingobjetrelationnel[1]
linasafaa556 visualizações
Qualité logicielle por cyrilgandon
Qualité logicielleQualité logicielle
Qualité logicielle
cyrilgandon1.4K visualizações
Drupal7 - Bonnes Pratiques (Partie 1) por Alexandre Marie
Drupal7 - Bonnes Pratiques (Partie 1)Drupal7 - Bonnes Pratiques (Partie 1)
Drupal7 - Bonnes Pratiques (Partie 1)
Alexandre Marie1.9K visualizações
SQL Server et les développeurs por Microsoft
SQL Server et les développeurs SQL Server et les développeurs
SQL Server et les développeurs
Microsoft600 visualizações
Cours dao por AlassaneKabr
Cours daoCours dao
Cours dao
AlassaneKabr21 visualizações
Cours jdbc por AlassaneKabr
Cours jdbcCours jdbc
Cours jdbc
AlassaneKabr13 visualizações
Javascript proprement por Guillaume Collic
Javascript proprementJavascript proprement
Javascript proprement
Guillaume Collic1K visualizações
Azure Camp 9 Décembre - slides session développeurs webmedia por Microsoft
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmedia
Microsoft1.7K visualizações
Formation d'architecte logiciel AFCEPF por Boubker ABERWAG
Formation d'architecte logiciel AFCEPFFormation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPF
Boubker ABERWAG639 visualizações
Rails 3 au Djangocong por Jérémy Lecour
Rails 3 au DjangocongRails 3 au Djangocong
Rails 3 au Djangocong
Jérémy Lecour763 visualizações
Seance_1_cours_introduction_java_Copie.pptx por RihabBENLAMINE
Seance_1_cours_introduction_java_Copie.pptxSeance_1_cours_introduction_java_Copie.pptx
Seance_1_cours_introduction_java_Copie.pptx
RihabBENLAMINE5 visualizações
Microservices-DDD-Telosys-Devoxx-FR-2022 por Laurent Guérin
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
Laurent Guérin203 visualizações
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) por univalence
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
univalence 1.3K visualizações
Patrons de conception de la programmation fonctionnelle por Association Agile Nantes
Patrons de conception de la programmation fonctionnellePatrons de conception de la programmation fonctionnelle
Patrons de conception de la programmation fonctionnelle
Association Agile Nantes1.5K visualizações
Abstract factory+adapter por Kamel Eddine Heragmi
Abstract factory+adapterAbstract factory+adapter
Abstract factory+adapter
Kamel Eddine Heragmi1.2K visualizações

Mais de Tarik Zakaria Benmerar

Videostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plus por
Videostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plusVideostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plus
Videostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plusTarik Zakaria Benmerar
357 visualizações21 slides
Chapitre 8 - les entrées - sorties por
Chapitre 8  - les entrées - sortiesChapitre 8  - les entrées - sorties
Chapitre 8 - les entrées - sortiesTarik Zakaria Benmerar
211 visualizações12 slides
Cyber pink - Time Management por
Cyber pink -  Time Management Cyber pink -  Time Management
Cyber pink - Time Management Tarik Zakaria Benmerar
203 visualizações20 slides
Chapitre 6 - couche transport por
Chapitre 6  - couche transportChapitre 6  - couche transport
Chapitre 6 - couche transportTarik Zakaria Benmerar
322 visualizações52 slides
Chapitre 5 - couche réseaux por
Chapitre 5 - couche réseauxChapitre 5 - couche réseaux
Chapitre 5 - couche réseauxTarik Zakaria Benmerar
189 visualizações39 slides
Chapitre 4 - couche liaison por
Chapitre 4 - couche liaisonChapitre 4 - couche liaison
Chapitre 4 - couche liaisonTarik Zakaria Benmerar
164 visualizações10 slides

Mais de Tarik Zakaria Benmerar(20)

Videostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plus por Tarik Zakaria Benmerar
Videostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plusVideostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plus
Videostreaming et visioconference pour le Web - Evènement GDSC USTHB Tech plus
Tarik Zakaria Benmerar357 visualizações
Chapitre 8 - les entrées - sorties por Tarik Zakaria Benmerar
Chapitre 8  - les entrées - sortiesChapitre 8  - les entrées - sorties
Chapitre 8 - les entrées - sorties
Tarik Zakaria Benmerar211 visualizações
Chapitre 3 - connecteurs et câbles por Tarik Zakaria Benmerar
Chapitre 3 -   connecteurs et câblesChapitre 3 -   connecteurs et câbles
Chapitre 3 - connecteurs et câbles
Tarik Zakaria Benmerar122 visualizações
Chapitre 1 - notions fondamentales por Tarik Zakaria Benmerar
Chapitre 1 -  notions fondamentalesChapitre 1 -  notions fondamentales
Chapitre 1 - notions fondamentales
Tarik Zakaria Benmerar142 visualizações
Chapitre 6 - les instructions de chaînes de caractères por Tarik Zakaria Benmerar
Chapitre 6  - les instructions de chaînes de caractèresChapitre 6  - les instructions de chaînes de caractères
Chapitre 6 - les instructions de chaînes de caractères
Tarik Zakaria Benmerar264 visualizações
Chapitre 5 - fichiers EXE-COM pour le dos por Tarik Zakaria Benmerar
Chapitre 5 -  fichiers EXE-COM pour le dosChapitre 5 -  fichiers EXE-COM pour le dos
Chapitre 5 - fichiers EXE-COM pour le dos
Tarik Zakaria Benmerar144 visualizações
Chapitre 4 - les instructions de saut et conditions por Tarik Zakaria Benmerar
Chapitre 4  - les instructions de saut et conditionsChapitre 4  - les instructions de saut et conditions
Chapitre 4 - les instructions de saut et conditions
Tarik Zakaria Benmerar170 visualizações
Chapitre 3 - échanges de données et opérations arithmétiques - binaires por Tarik Zakaria Benmerar
Chapitre 3  - échanges de données et opérations arithmétiques - binairesChapitre 3  - échanges de données et opérations arithmétiques - binaires
Chapitre 3 - échanges de données et opérations arithmétiques - binaires
Tarik Zakaria Benmerar133 visualizações
Chapitre 2.2 - architecture d'un microprocesseur - jeux d'instructions et reg... por Tarik Zakaria Benmerar
Chapitre 2.2 - architecture d'un microprocesseur - jeux d'instructions et reg...Chapitre 2.2 - architecture d'un microprocesseur - jeux d'instructions et reg...
Chapitre 2.2 - architecture d'un microprocesseur - jeux d'instructions et reg...
Tarik Zakaria Benmerar206 visualizações
Chapitre 2.1 - architecture d'un microprocesseur - bus et communication por Tarik Zakaria Benmerar
Chapitre 2.1 -  architecture d'un microprocesseur - bus et communicationChapitre 2.1 -  architecture d'un microprocesseur - bus et communication
Chapitre 2.1 - architecture d'un microprocesseur - bus et communication
Tarik Zakaria Benmerar486 visualizações
Chapitre 1 - représentation numérique des données por Tarik Zakaria Benmerar
Chapitre 1  - représentation numérique des donnéesChapitre 1  - représentation numérique des données
Chapitre 1 - représentation numérique des données
Tarik Zakaria Benmerar194 visualizações
Chapitre 3 - Protocole Bus CAN (2020/2021 por Tarik Zakaria Benmerar
Chapitre 3 - Protocole Bus CAN (2020/2021Chapitre 3 - Protocole Bus CAN (2020/2021
Chapitre 3 - Protocole Bus CAN (2020/2021
Tarik Zakaria Benmerar962 visualizações
Chapitre 2 - Protocole Modbus (2020/2021) por Tarik Zakaria Benmerar
Chapitre 2 - Protocole Modbus (2020/2021)Chapitre 2 - Protocole Modbus (2020/2021)
Chapitre 2 - Protocole Modbus (2020/2021)
Tarik Zakaria Benmerar660 visualizações

OOP & Design Pattern - Algiers Developers Meetup August 2015

  • 1. OOP & DESIGN PATTERN Tarik Zakaria Benmerar Acigna Inc.
  • 3. LES PRINCIPES DE LA CONCEPTION DES LOGICIELS
  • 4. DRY ( DON’T REPEAT YOURSELF ) Chaque connaissance dans le système doit avoir une représentation unique et non ambigüe.
  • 5. DRY: • Réutilisez du code, ne le dupliquez pas. • Choisissez des noms clairs. • Choisissez le bon endroit pour le code.
  • 6. DRY: <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; } } else { echo "0 results"; } $conn->close(); ?>
  • 7. DRY: <?php function retrieveGuests( $conn ) { $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql), $resultArr = []; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $resultArr[] = $row; } } return $resulArr; } ?> Le code sera placée dans guests/models.php
  • 8. SRP ( SINGLE RESPONSABILITY PRINCIPLE ) Chaque code doit avoir une seule responsabilité. Le code doit être cohésive.
  • 9. SRP: <?php $conn = getConnection(); $guests = retrieveGuests( $conn ); showGuests( $guests ); closConnection( $conn ); ?> ---------------------------------------------------------------------- <?php function showGuests( $guests ) { if( count( $guests ) ) { for( $i = 0; $i < count( $guests ); $i++ ) { $row = $guests[ i ]; echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; } } else { echo "0 results"; } } ?>
  • 10. TDA ( TELL DON’T ASK ) Déclarez des actions, au lieu de se poser des questions.
  • 11. TDA: ---------------------------------------------------------------------- <?php function showGuests( $guests ) { if( count( $guests ) ) { foreach( $guests as $row ) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; } } else { echo "0 results"; } } ?> ----------------------------------------------------------------------- var numbers = [….]; numbers.some(function ( number ) { return !numbers % 2; });
  • 12. YAGNI ( YOU AREN’T GONNA NEED IT YET ) Ecrivez du code que vous avez besoin maintenant.
  • 13. OCP ( OPEN CLOSE PRINCIPLE ) Ouvert pour l’extensibilité. Fermé pour la modification.
  • 14. LSP ( LISKOV’S SUBTITUTION PRINCIPLE ) Utilisez l’héritage seulement si vous signifiez la substitution des deux classes (parent et fils).
  • 15. LSP: <?php class Rectangle { private $topLeft; private $width; private $height; public function setHeight($height) { $this->height = $height; } public function getHeight() { return $this->height; } public function setWidth($width) { $this->width = $width; } public function getWidth() { return $this->width; } public function area() { return $this->width * $this->height; } } ?> <?php class Square extends Rectangle { public function setHeight($height) { $this->height = $height; $this->widget = $height; } public function setWidth($width) { $this->width = $width; $this->height = $width; } } ?> <?php class Square { private $rectangle public function setSide( $side ) { $this->rectangle->setWidth( $side ); $this->rectangle->setHeight( $side ); } public function area() { return $this->rectangle->area(); } } ?>
  • 16. DIP ( DEPENDENCY INVERSION PRINCIPLE ) Inversement du contrôle des dépendances.
  • 17. DIP: <?php class Square { private $rectangle public function _construct() { $this->rectangle = new Rectangle(); } public function setSide( $side ) { $this->rectangle->setWidth( $side ); $this->rectangle->setHeight( $side ); } public function area() { return $this->rectangle->Area(); } } ?> <?php class Square { private $rectangle public function _construct( $rectangle ) { $this->rectangle = $rectangle; } public function setSide( $side ) { $this->rectangle->setWidth( $side ); $this->rectangle->setHeight( $side ); } public function area() { return $this->rectangle->Area(); } } ?>
  • 19. DESIGN PATTERN: • Recettes prêtes pour des problèmes de programmation orienté objet (Qui répondent aux principes déjà discutés). • Reutilisation de code : pas de reinvention de la rue. • Assurer un langage commun. • Applicable à un contexte.
  • 21. 3 CATÉGORIES DE PATTERNS • Créationnel. • Instanciation d’objets. • Structurel. • Structures larges d’objets et de classes. • Comportemental. • Interaction et distribution de responsabilités.
  • 22. DESIGN PATTERNS CRÉATIONNELS: • Factory : Créer des objets sans exposer la logique d’instanciation. • Abstract Factory : Encapsulation d’une famille de factories qui produit des familles d’objets. • Builder : Séparation de la construction d’un objet complexe de sa représentation. • Singleton : Assurer qu’une seule instance d’une classe existe tout en fournissant une seule méthode pour accéder cette instance. • Prototype : Créer une instance initialisée pour clonage. • Object Pool : Réutilisation et partage d’objets coûteux à créer.
  • 23. DESIGN PATTERNS STRUCTURELS: • Adapter : Adapter une interface à une autre incompatible. • Bridge : Séparer l’abstraction de l’implémentation. • Composite : Composer les objets dans une structure d’arbres. • Decorator : Ajouter de nouveaux comportements de façon dynamique ou statiques. • Facade : Simplifier l’utilisation en définissant une interface de haut niveau. • Flyweight : Partager une partie des états d’objets. • Proxy : Créer une référence à un autre objet (pouvant être distant).
  • 24. DESIGN PATTERNS COMPORTEMENTAUX: • Chaine de Responsabilité : Définir une méthode pour faire passer une requête à travers une chaine d’objets. • Commande : Encapsuler une requête type commande dans un objet. • Interpreter : Spécifier comment interpréter un langage. • Iterator : Accéder aux éléments d’une conteneur. • Mediator : Centralisation du mécanisme de communication entre les objets. • Memento : Permettre la récupération des états antérieurs. • Observer : Notifier plusieurs objets du changement d’état d’un objet particulier.
  • 25. DESIGN PATTERNS COMPORTEMENTAUX: • State : Encapsuler différents comportements pour la même routine en se basant sur l’état de l’objet. • Strategy : Séparer l’implémentation de l’algorithme de son utilisation. • Template Method : Définir le squelette d’un algorithme dans une opération, différer certaines étapes dans les sous- classes. • Visitor : Séparer un algorithme de la structure d’objet sur lequel il opère. • Null Object : Définir un objet avec un comportement neutre.
  • 26. TOUT CELA EST BIEN, MAIS CE N’EST QUE LE DÉBUT DE L’HISTOIRE……
  • 27. LE DESIGN EMERGEANT (ET ARCHITECTURE ÉVOLUTIONNAIRE)
  • 28. LE DESIGN EMERGEANT: • On ne peut pas prévoir les design patterns à utiliser, on les découvre. • Les patterns présentés sont de nature technique, alors qu’il existe des patterns du domaine. • Le logiciel en lui-même change d’objectif et de structure, de fait de plusieurs facteurs de l’environnement.
  • 29. PRÉPARER L’ÉMERGENCE DU DESIGN: • Le code doit être expressif. • Les responsables de l’architecture doivent coder eux aussi. • Séparer l’architecture (difficile à changer) du design (assez flexible pour être changé). • Les décisions définitives de la conception doivent être faits le plus tard possible. • Choisissez un framework qui est découplé et qui respecte les principes de la bonne conception. • Comprendre le domaine d’étude. • Adopter le TDD (Un programme difficile à tester implique à un certain niveau une mauvaise conception).
  • 30. Extracted vs. preemptive frameworks The best frameworks tend to be those extracted from working code rather than preemptively designed. Someone sitting down to design a framework must anticipate all the ways developers might want to use it. The framework ends up including lots of features, with a high chance that any given user won't use all of them. But you still must take the unused features of your chosen framework into account, because they add to your applications' accidental complexity; this could mean doing something as simple as making extra entries in a configuration document, or as intrusive as changing the way you'd like to implement a feature. Preemptive frameworks tend to be giant buckets of features, with other (unanticipated) features left out. JavaServer Faces (JSF) is a classic example of a preemptive framework. One of its cool features is the ability to plug in different rendering pipelines, in case you want to emit a format other than HTML. Although this feature is used rarely, all JSF users must understand its impact on a JSF request's life cycle. Frameworks that grow from working applications tend to offer a more pragmatic set of features, because they address the actual problems someone faced when writing an application. Extracted frameworks tend to have fewer extraneous features. Contrast a preemptive framework like JSF with an extracted framework like Ruby on Rails, which has grown from actual usage.
  • 31. LE PATTERN DU DOMAINE (ANALYSIS PATTERN)
  • 32. • Les Designs Patterns répondent à des problématiques purement techniques, et peuvent éventuellement s’appliquer à une conception d’un domaine d’étude (Finance, Sport, Recrutement, etc. ou Conception Orientée Domaine). • Les Patterns du domaine reflètent des concepts profondes émergeant du domaine. PATTERN DU DOMAINE :
  • 33. MODÈLE DE COMPTABILITÉ AVEC UN SYSTÈME DE TRANSACTION
  • 35. • Language réduit pour définir et générer un modèle. • S’applique dans un cadre particulier du domaine. • Communique plus clairement l’objectif d’une partie du système. • Améliore la communication avec les experts du domaine. • Constitue un modèle alternative à une conception purement orientée objet. • Exemples : • Grammaire d’un langage de programmation. • Automate à été fini. DOMAIN SPECIFIC LANGUAGE :
  • 38. • Evolutionary Architecture And Emergent design, Neal Ford. IBM Developer Works. http://www.ibm.com/developerworks/views/java/libraryview.js p?site_id=1&contentarea_by=Java&sort_by=Date&sort_order =1&start=1&end=19&topic_by=&product_by=&type_by=All% 20Types&show_abstract=true&search_by=evolutionary%20ar chitecture%20emergent%20design:&industry_by=&series_titl e_by=