SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
The Open/Closed Principle
Agile Thailand 2014
Pairs
เริ่มต้นกับ FizzBuzz
1, 2, Fizz, 4, Buzz, Fizz, 7,
8, Fizz, Buzz, 11, Fizz, 13,
14, FizzBuzz, 16, 17, Fizz
ถ้าตัวเลขหาร 3 ลงตัว แสดงคําว่า Fizz
ถ้าตัวเลขหาร 5 ลงตัว แสดงคําว่า Buzz
ถ้าตัวเลขหาร 3 และ 5 ลงตัว แสดงคําว่า FizzBuzz
๤่วนอื่นๆ แสดงค่าเลขนั้นๆ
มันง่ายเกินไปนะ
public String say(Integer number) {

if( isFizz( number ) && isBuzz( number ) ) {

return “FizzBuzz”;

}

if( isFizz( number ) ) {

return “Fizz”;

}

if( isBuzz( number ) ) {

return “Buzz”;

}

return number.toString();

} 

private boolean isFizz(Integer number) {

return number % 3 == 0;

}
ลองเพิ่ม Requirement หน่อย
ถ้าตัวเลขหาร7 ลงตัว แสดงคําว่า Bang
มันก็ง่ายนะ
public String say(Integer number) {

if( isBang( number ) ) { 

return “Bang”;

}

if( isFizz( number ) && isBuzz( number ) ) {

return “FizzBuzz”;

}

if( isFizz( number ) ) {

return “Fizz”;

}

if( isBuzz( number ) ) {

return “Buzz”;

}

return number.toString();

} 

แต่ยังก่อน … ต้องการแบบนี้
ถ้าตัวเลขหาร 3 และ 7 ลงตัว แสดงคําว่า FizzBang
ถ้าตัวเลขหาร 5 และ 7 ลงตัว แสดงคําว่า BuzzBang
ถ้าตัวเลขหาร 3, 5 และ 7 ลงตัว แสดงคําว่า FizzBuzzBang
วิธีการที่ไม่ควรทํา !!!
public String say(Integer number) {

if( isFizz( number ) && isBuzz( number ) && isBang( number ) ) {

return “FizzBuzzBang”

}

if( isBuzz( number ) && isBang( number ) ) {

return “BuzzBang”;

}

if( isFizz( number ) && isBang( number ) ) {

return “FizzBang”;

}

… 

…

} 

นี่คือวิธีการที่ดีแล้วหรือ ?
ทุกๆ ครั้งที่มีการเพิ่ม หรือ แก้ไขความต้องการจากลูกค้า

คุณทำแบบนี้หรือ ?
มีคนบอกว่า
การเพิ่ม IF เข้าไป มันคือการสร้างปีศาจขึ้นมา
http://www.antiifcampaign.com/
The Open/Closed Principle
๤่วนการทํางานต่างๆ ของ Software
เ๡่น class, module, function และ๤่วนอื่นๆ
ควรจะ
เปิด ๤ําหรับการเพิ่มหรือขยาย
แต่ ปิด ๤ําหรับการแก้ไข
เราสร้าง feature อย่างไร
แนวทางการเพิ่ม feature
• คุณสามารถทําการแก้ไขเฉพาะ ตอนการสร้าง object และสร้าง
class ใหม่ขึ้นมาเท่านั้น ?
• ถ้าสามารถทําได้ แสดงว่าระบบดีล่ะ
• ถ้าไม่ ให้ทําการ refactor จนกว่าจะทําได้
กฎของ OCP Kata
1. เขียน Fail test
2. เขียน code เพื่อสร้าง object ขึ้นมา ทําให้ test ผ่าน
1. เ๡่นการสร้าง Factory class ๤ําหรับสร้าง object
2. ไม่มี if-else
3. เขียน Fail test เพิ่มอีก
4. สามารถเขียน code ให้ผ่านด้วยการเปลี่ยนแปลง code ใน Factory
หรือทําการสร้าง class ใหม่หรือไม่
1. ถ้า ใ๡่ กลับไปทําข้อ 3
2. ถ้า ไม่ ให้ทําการ refactor code จนกระทั่งทําข้อ 4 ได้
เริ่ม coding กันดีกว่า
Test case ที่ 1
say(1) return 1
say(2) return 2
Test case ที่ 2
say(3) return “Fizz”
say(6) return “Fizz”
Test case ที่ 3
say(5) return “Buzz”
say(10) return “Buzz”
Test case ที่ 4
say(3*5) return “FizzBuzz”
Test case ที่ 5
say(7) return “Bang”
say(14) return “Bang”
Test case สุดท้าย
say(3*7) return “FizzBang”
say(5*7) return “BuzzBang”
say(3*5*7) return “FizzBuzzBang”
เอามาโชว์หน่อย๤ิ
Test case ที่ 1
Test case ที่ 2
๤ําหรับ Test case อื่นๆ
https://github.com/up1/kata_fizzbuzz_ocp
ข้อคิดสะกิดใจ
1. ก่อนที่จะทําการ code ต้องคิดว่าจะสร้าง feature ให้ง่ายได้อย่างไร
2. ก่อนที่จะ refactor ต้อง คิด และ วางแผน
3. ทําการ Refactor ตอนที่ test ผ่านทั้งหมด
4. ถ้าแก้ไขแล้วงง แนะนําให้ใ๡้ Ctrl+Z ไปจนกว่า test จะผ่าน
5. เมื่อต้องการเพิ่ม feature ใหม่ ให้เพิ่มใน๤่วนขยายเท่านั้น
เริ่มต้นกันใหม่ …

Contenu connexe

En vedette

Robot Framework :: Demo login application
Robot Framework :: Demo login applicationRobot Framework :: Demo login application
Robot Framework :: Demo login applicationSomkiat Puisungnoen
 
Better Support for Functional Programming in Angular 2
Better Support for Functional Programming in Angular 2Better Support for Functional Programming in Angular 2
Better Support for Functional Programming in Angular 2Viktor Savkin
 
Roaming Analytics Platform V1.1
Roaming Analytics Platform V1.1Roaming Analytics Platform V1.1
Roaming Analytics Platform V1.1Jack Brown
 
PROEXPOSURE Photographer: Betelhem Abate
PROEXPOSURE Photographer: Betelhem AbatePROEXPOSURE Photographer: Betelhem Abate
PROEXPOSURE Photographer: Betelhem AbatePROEXPOSURE CIC
 
Hs Classroom Guidelines
Hs Classroom GuidelinesHs Classroom Guidelines
Hs Classroom Guidelinesjaspang
 
Архивное хранение документов в условиях электронного документооборота
Архивное хранение документов в условиях электронного документооборотаАрхивное хранение документов в условиях электронного документооборота
Архивное хранение документов в условиях электронного документооборотаNatasha Khramtsovsky
 
Protecting Sensitive Data using Encryption and Key Management
Protecting Sensitive Data using Encryption and Key ManagementProtecting Sensitive Data using Encryption and Key Management
Protecting Sensitive Data using Encryption and Key ManagementStuart Marsh
 
JCCS Online Survey Results
JCCS Online Survey ResultsJCCS Online Survey Results
JCCS Online Survey Resultsmrounds5
 

En vedette (20)

Robot Framework :: Demo login application
Robot Framework :: Demo login applicationRobot Framework :: Demo login application
Robot Framework :: Demo login application
 
Sprint3 r unit-test
Sprint3 r unit-testSprint3 r unit-test
Sprint3 r unit-test
 
Stad G E N K
Stad  G E N KStad  G E N K
Stad G E N K
 
Better Support for Functional Programming in Angular 2
Better Support for Functional Programming in Angular 2Better Support for Functional Programming in Angular 2
Better Support for Functional Programming in Angular 2
 
De rol van hun leven - Unie der Zorgelozen
De rol  van hun leven - Unie der ZorgelozenDe rol  van hun leven - Unie der Zorgelozen
De rol van hun leven - Unie der Zorgelozen
 
Heemkunde Vlaanderen
Heemkunde VlaanderenHeemkunde Vlaanderen
Heemkunde Vlaanderen
 
Git 101 for_tarad_dev
Git 101 for_tarad_devGit 101 for_tarad_dev
Git 101 for_tarad_dev
 
Inheritance
InheritanceInheritance
Inheritance
 
Roaming Analytics Platform V1.1
Roaming Analytics Platform V1.1Roaming Analytics Platform V1.1
Roaming Analytics Platform V1.1
 
Van Alfapret Tot Vogelzang (Socius)
Van Alfapret Tot Vogelzang (Socius)Van Alfapret Tot Vogelzang (Socius)
Van Alfapret Tot Vogelzang (Socius)
 
Kunst op het Hof
Kunst op het HofKunst op het Hof
Kunst op het Hof
 
Beleidsplanning voor bewegingen
Beleidsplanning voor bewegingenBeleidsplanning voor bewegingen
Beleidsplanning voor bewegingen
 
Lordi Lana
Lordi LanaLordi Lana
Lordi Lana
 
PROEXPOSURE Photographer: Betelhem Abate
PROEXPOSURE Photographer: Betelhem AbatePROEXPOSURE Photographer: Betelhem Abate
PROEXPOSURE Photographer: Betelhem Abate
 
Hs Classroom Guidelines
Hs Classroom GuidelinesHs Classroom Guidelines
Hs Classroom Guidelines
 
Архивное хранение документов в условиях электронного документооборота
Архивное хранение документов в условиях электронного документооборотаАрхивное хранение документов в условиях электронного документооборота
Архивное хранение документов в условиях электронного документооборота
 
Protecting Sensitive Data using Encryption and Key Management
Protecting Sensitive Data using Encryption and Key ManagementProtecting Sensitive Data using Encryption and Key Management
Protecting Sensitive Data using Encryption and Key Management
 
Ud Arte
Ud ArteUd Arte
Ud Arte
 
JCCS Online Survey Results
JCCS Online Survey ResultsJCCS Online Survey Results
JCCS Online Survey Results
 
Tech Award Presentation, 2011
Tech Award Presentation, 2011Tech Award Presentation, 2011
Tech Award Presentation, 2011
 

Plus de Somkiat Puisungnoen (20)

Next of Java 2022
Next of Java 2022Next of Java 2022
Next of Java 2022
 
Sck spring-reactive
Sck spring-reactiveSck spring-reactive
Sck spring-reactive
 
Part 2 :: Spring Boot testing
Part 2 :: Spring Boot testingPart 2 :: Spring Boot testing
Part 2 :: Spring Boot testing
 
vTalk#1 Microservices with Spring Boot
vTalk#1 Microservices with Spring BootvTalk#1 Microservices with Spring Boot
vTalk#1 Microservices with Spring Boot
 
Lesson learned from React native and Flutter
Lesson learned from React native and FlutterLesson learned from React native and Flutter
Lesson learned from React native and Flutter
 
devops
devops devops
devops
 
Angular :: basic tuning performance
Angular :: basic tuning performanceAngular :: basic tuning performance
Angular :: basic tuning performance
 
Shared code between projects
Shared code between projectsShared code between projects
Shared code between projects
 
Distributed Tracing
Distributed Tracing Distributed Tracing
Distributed Tracing
 
Manage data of service
Manage data of serviceManage data of service
Manage data of service
 
RobotFramework Meetup at Thailand #2
RobotFramework Meetup at Thailand #2RobotFramework Meetup at Thailand #2
RobotFramework Meetup at Thailand #2
 
Visual testing
Visual testingVisual testing
Visual testing
 
Cloud Native App
Cloud Native AppCloud Native App
Cloud Native App
 
Wordpress for Newbie
Wordpress for NewbieWordpress for Newbie
Wordpress for Newbie
 
Sck Agile in Real World
Sck Agile in Real WorldSck Agile in Real World
Sck Agile in Real World
 
Clean you code
Clean you codeClean you code
Clean you code
 
SCK Firestore at CNX
SCK Firestore at CNXSCK Firestore at CNX
SCK Firestore at CNX
 
Unhappiness Developer
Unhappiness DeveloperUnhappiness Developer
Unhappiness Developer
 
The Beauty of BAD code
The Beauty of  BAD codeThe Beauty of  BAD code
The Beauty of BAD code
 
React in the right way
React in the right wayReact in the right way
React in the right way
 

Kata:: Open Closed Principle