SlideShare a Scribd company logo
1 of 41
Code Refactoring
THAY ĐỔI NHỎ - LỢI ÍCH LỚN
Nội dung
• Tại sao cần code refactoring
• Mã bẩn
• Các kỹ thuật refactoring
• Demo
Tốc độ phát hành phần mềm
Tuyên ngôn Agile
Chúng tôi đã phát hiện ra cách phát triển phần mềm tốt hơn bằng cách thực
hiện nó và giúp đỡ người khác thực hiện. Qua công việc này, chúng tôi đã đi đến việc
đánh giá cao:
Cá nhân và sự tương tác hơn là quy trình và công cụ;
Phần mềm chạy tốt hơn là tài liệu đầy đủ;
Cộng tácvới khách hàng hơn là đàm phán hợp đồng;
Phản hồi với các thay đổihơn là bám sát kế hoạch.
Mặc dù các điều bên phải vẫn còn giá trị, nhưng chúng tôi đánh giá cao hơn các mục ở bên trái.
AgileAlliance.org
Chuyển giao nhanh
Thời gian
…
Iteration
Design is the key,
Planned Design is not …
• Takeuchi & Nonaka: overlapping is better than sequential
Not efficient:
• Time consuming
• No backward
• No “better idea” on the go
Làm thế nào để tổ chức kiểu “Overlapping” như thế này?
Simple Design là gì?
• Design sẽ tiến hoá theo quá trình
• KHÔNG cần có design toàn bộ từ đầu. Vừa đủ thôi
• Là một phần của quy trình phát triển
• Chương trình lớn lên thì design sẽ thay đổi theo
• Không phải là chiến thuật “code and fix”
7
Evolve
Simplicity
Rationale behind Simple Design
• ”Tạo ra thứ đơn giản nhất có thể chạy được“
• ”Chúng ta sẽ không bao giờ cần tới nó“
• Đầu tư cho mẫu thiết kế
• Hệ thống tối giản
1. Chạy toàn bộ test
2. Rõ mục đích
3. Không trùng lặp
4. Có ít lớp và phương thức nhất có thể
8
Thiết kế để Giao tiếp
• Vẽ thiết kế ra để thảo luận trong nhóm
• Chỉ cần đủ để làm rõ giải pháp
• Chỉ nên sử dụng các lưu đồ đơn giản, không mất nhiều công
duy trì
• Giữ minh bạch các lưu đồ
• Treo ở tường
• Khuyến khích mọi người cập nhật
• Để ý xem liệu mọi người có dùng không, hay là vứt xó
9
Thiết kế để Xây dựng
• “Phần mềm chạy tốt là thước đo chính về tiến độ”
• Thiết kế sẽ được chuyển thành tính năng chạy được, do đó:
• Design phải chia ra để code được trong nhóm
• Phân tách, interface, giao tiếp giữa các thành phần
• Design phải kiểm thử được
• “Kiến trúc sư cần phải code”
10
Refactoring
• Để có thiết kế đơn giản hơn
• Duy trì, cập nhật dễ hơn
• Là một việc bắt buộc phải làm
• Để ý đến mẫu thiết kế và các best practices
11
Image: http://www.testically.org
Tái cấu trúc mã nguồn
• Tái cấu trúc mã nguồn là các kỹ thuật cho phép chỉnh sửa mã
nguồn nội bộ mà không làm thay đổi hành vi của hệ thống đối
với bên ngoài
• Tái cấu trúc mã nguồn nhằm mục đích chính:
• Mã nguồn dễ duy trì hơn
• Mã nguồn dễ mở rộng hơn
Lưu ý: Tái cấu trúc mã nguồn không phải luôn luôn giúp tăng hiệu năng
(performance) của thuật toán. Trong một số trường hợp, có thể cần hy sinh hiệu
năng để có được mã nguồn tốt hơn
Development Flow
Requirement
Analysis
UI Mocking
•Customer
discussion
Design Draft
•Design
Discussion
Code the
skeleton to
test the
design
Coding in
team
Refactoring
and
Refinement
Build the
increment
$
DevTeamPO
Collaboration:
Steps:
Artifacts:
As a super user,
I want to …
A
B
IDo
Interface IDo{
//TODO …
}
Class A{
//TODO …
}
Class B:IDo{
//TODO …
}
Interface IDo{
//TODO …
}
Class A{
method1(){
//Mr. A codes here
}
}
Class B:IDo{
method1(){
//Mrs. B codes here
}
}
Class C{
}
$
PO
Tiến hoá của các Model
com.myapp.Models
com.myapp.Views
com.myapp.Controllers
Sprint 0
updated story
V1
M1
IDo
C1
V1
M1
IDo
C1
V2
M2
Sprint 1 Sprint 2
Product
Backlog
Items burnt
Items burnt
Initial Architecture Model1 Model 2
“Continuous” Architecting
Sprint #1: without layering
Presentation
Tier
Application
Layer
Business Layer
Data Access
Layer
Data Tier
“Continuous” Architecting
Sprint #2: refactoring to layers
16
Presentation Tier
Application
Layer
Business Layer
Data Access
Layer
Data Tier
“Continuous” Architecting
Sprint #3: architecting “on the go”
17
Presentation Tier Application Layer Business Layer Data Access Layer Data Tier
CodeSmell
Phương thức dài quá
Dấu hiệu:
• Quá nhiều dòng code
• Có quá nhiều tầng code
• Độ phức tạp cao
Xử lý:
• Tách phương thức
• Sử dụng Parameter Object
• Phân tách các khối lệnh điều
kiện
19
Lớp to quá
Dấu hiệu:
• Có quá nhiều trường
• Có quá nhiều phương thức
• Có quá nhiều dòng code
Xử lý:
• Tách lớp
• Tách lớp con
• Tách interface
20
Danh sách tham số dài quá
Dấu hiệu:
• Có nhiều hơn 3 hoặc 4 tham
số cho một phương thức
Xử lý:
• Thay thế tham số bằng lời gọi
phương thức
• Giữ nguyên object
• Truyền vào đối tượng
21
Mã bị lặp
Dấu hiệu:
• Hai hoặc nhiều đoạn mã nhìn
gần giống nhau
Xử lý:
• Tách phương thức
• Tách lớp cha
• Chuyển thành template method
• Thay thế thuật toán
22
Ghi chú
Dấu hiệu:
• Có nhiều ghi chú để giải thích
các đoạn mã
Xử lý:
• Tách biến
• Tách phương thức
• Thay đổi tên phương thức
23
Một số dạng khác
Một số kỹ thuật tái cấu trúc
Kỹ thuật đổi tên biến
Kỹ thuật đổi tên phương thức
Kỹ thuật tách biến
Kỹ thuật tách hằng
Kỹ thuật tách phương thức
Đổi tên biến và phương thức
• Thay đổi tên biến hoặc phương thức để trở nên tốt hơn: dễ
đọc, có ý nghĩa, thể hiện được ý nghĩa, tuân thủ coding
convention
• Khi đổi tên biến hoặc phương thức cần lưu ý:
• Đổi tên tại vị trí khai báo
• Đổi tên tại tất cả các vị trí có sử dụng biến hoặc phương thức
• Nên sử dụng tính năng của IDE để đổi tên biến hoặc phương
thức
Tách biến
• Trong nhiều trường hợp, các biểu thức phức tạp sẽ gây khó
hiểu
• Tách biến (Variable Extraction) là kỹ thuật giúp đơn giản hoá
các biểu thức và giúp dễ hiểu hơn
Tách biến: Ví dụ kiểm tra năm nhuận
function isLeapYear(year) {
if(year % 4 == 0){
if (year % 100 == 0){
if(year % 400 == 0)
return true;
} else {
return true;
}
}
return false;
}
function isLeapYear(year) {
varr isDivisibleBy4 = year % 4 == 0;
if(isDivisibleBy4){
varr isDivisibleBy100 = year % 100 == 0;
if (isDivisibleBy100){
varr isDivisibleBy400 = year % 400 == 0;
if(isDivisibleBy400)
return true;
} else {
return true;
}
}
return false;
}
Tách hằng
• Trong nhiều trường hợp, các giá trị “thần kỳ” (magic value) sẽ
gây khó khăn cho việc đọc hiểu mã nguồn
• Tách hằng giúp mang lại ý nghĩa cho các giá trị “thần kỳ” và mã
nguồn dễ hiểu hơn
Tách hằng: Ví dụ phân quyền dựa vào
role
function isAuthorized(var role){
if(role == 1){
return true;
}
return false;
}
const ROLE_ADMIN = 1;
function isAuthorized(role){
if(role == ROLE_ADMIN){
return true;
}
return false;
}
Tách phương thức
• Trong nhiều trường hợp, một phương thức quá dài, quá phức
tạp hoặc xử lý quá nhiều tác vụ sẽ dẫn đến khó hiểu, khó kiểm
soát
• Tách phương thức giúp cho các phương thức dễ đọc hiểu hơn,
dễ kiểm soát hơn
Tách phương thức: Ví dụ tính số ngày
function getDaysOfMonth(month, year){
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
…
case 2:
var isLeapYear = false;
if(year % 4 == 0){
if (year % 100 == 0){
if(year % 400 == 0)
isLeapYear = true;
} else {
isLeapYear = true;
}
}
if(isLeapYear){
return 29;
} else {
return 28;
}
default:
return 0;
}
function getDaysOfMonth(month, year){
switch (month){
…..
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
var isLeapYear = isLeapYear(year);
if(isLeapYear){
return 29;
} else {
return 28;
}
default:
return 0;
}
}
function isLeapYear(year) {
var isLeapYear = false;
if(year % 4 == 0){
if (year % 100 == 0){
if(year % 400 == 0)
isLeapYear = true;
} else {
isLeapYear = true;
}
}
return isLeapYear;
}
Thay thế thuật toán
Refactoring to Patterns
• Strategy
• Decorator
• Command
• Template Method
• Abstract Builder
• …
Code Refactoring: Thay đổi nhỏ - Lợi ích lớn

More Related Content

What's hot

BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ Le Cuong
 
Hướng dẫn sử dụng Selenium ide
Hướng dẫn sử dụng Selenium ideHướng dẫn sử dụng Selenium ide
Hướng dẫn sử dụng Selenium ideThiện Dương
 
Kiểm thử bảo mật web
Kiểm thử bảo mật webKiểm thử bảo mật web
Kiểm thử bảo mật webMinh Tri Nguyen
 
Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...
Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...
Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...MasterCode.vn
 
Quản trị dự án công nghệ thông tin
Quản trị dự án công nghệ thông tinQuản trị dự án công nghệ thông tin
Quản trị dự án công nghệ thông tinAnh Dam
 
Bài Giảng Vi Xử Lý PIT
Bài Giảng Vi Xử Lý PITBài Giảng Vi Xử Lý PIT
Bài Giảng Vi Xử Lý PITNgô Doãn Tình
 
123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdf
123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdf123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdf
123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdfDuongDo35
 
Đồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềmĐồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềmNguyễn Anh
 
Tương tác người-máy
Tương tác người-máyTương tác người-máy
Tương tác người-máyAlice_Stone
 
Học cách học (Learning How To Learn)
Học cách học (Learning How To Learn)Học cách học (Learning How To Learn)
Học cách học (Learning How To Learn)DUONG Trong Tan
 
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Thanh Giảng Lê
 
Báo cáo SQL injecttion
Báo cáo SQL injecttionBáo cáo SQL injecttion
Báo cáo SQL injecttionDuy Nguyenduc
 
Module 6: Sử Dụng Internet Cơ Bản
Module 6: Sử Dụng Internet Cơ BảnModule 6: Sử Dụng Internet Cơ Bản
Module 6: Sử Dụng Internet Cơ BảnLong Nguyen
 
Bài giảng thiết kế website - truongkinhtethucpham.com
Bài giảng thiết kế website - truongkinhtethucpham.comBài giảng thiết kế website - truongkinhtethucpham.com
Bài giảng thiết kế website - truongkinhtethucpham.commai_non
 

What's hot (20)

BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
 
Hướng dẫn sử dụng Selenium ide
Hướng dẫn sử dụng Selenium ideHướng dẫn sử dụng Selenium ide
Hướng dẫn sử dụng Selenium ide
 
Kiểm thử bảo mật web
Kiểm thử bảo mật webKiểm thử bảo mật web
Kiểm thử bảo mật web
 
Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...
Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...
Bài 3: Xác định yêu cầu hệ thống & Phân tích quy trình xử lý nghiệp vụ - Giáo...
 
Quản trị dự án công nghệ thông tin
Quản trị dự án công nghệ thông tinQuản trị dự án công nghệ thông tin
Quản trị dự án công nghệ thông tin
 
Bài Giảng Vi Xử Lý PIT
Bài Giảng Vi Xử Lý PITBài Giảng Vi Xử Lý PIT
Bài Giảng Vi Xử Lý PIT
 
123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdf
123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdf123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdf
123doc-giai-ngan-hang-cong-nghe-phan-mem-ptit.pdf
 
Đồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềmĐồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềm
 
Tương tác người-máy
Tương tác người-máyTương tác người-máy
Tương tác người-máy
 
Học cách học (Learning How To Learn)
Học cách học (Learning How To Learn)Học cách học (Learning How To Learn)
Học cách học (Learning How To Learn)
 
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
 
Báo cáo SQL injecttion
Báo cáo SQL injecttionBáo cáo SQL injecttion
Báo cáo SQL injecttion
 
Lý Thuyết SQL
Lý Thuyết SQLLý Thuyết SQL
Lý Thuyết SQL
 
Module 6: Sử Dụng Internet Cơ Bản
Module 6: Sử Dụng Internet Cơ BảnModule 6: Sử Dụng Internet Cơ Bản
Module 6: Sử Dụng Internet Cơ Bản
 
Jmeter tool
Jmeter toolJmeter tool
Jmeter tool
 
NoSql Database
NoSql DatabaseNoSql Database
NoSql Database
 
Bài giảng thiết kế website - truongkinhtethucpham.com
Bài giảng thiết kế website - truongkinhtethucpham.comBài giảng thiết kế website - truongkinhtethucpham.com
Bài giảng thiết kế website - truongkinhtethucpham.com
 
Tình cảm và ý chí
Tình cảm và ý chíTình cảm và ý chí
Tình cảm và ý chí
 
Chuong 2. cnpm
Chuong 2. cnpmChuong 2. cnpm
Chuong 2. cnpm
 
Coding standard
Coding standardCoding standard
Coding standard
 

Similar to Code Refactoring: Thay đổi nhỏ - Lợi ích lớn

How to write good code
How to write good code How to write good code
How to write good code Minh Hoang
 
Itlc2015
Itlc2015Itlc2015
Itlc2015Huy Do
 
ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...
ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...
ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...Vu Hung Nguyen
 
The art of readable code - Chapter I,II
The art of readable code - Chapter I,IIThe art of readable code - Chapter I,II
The art of readable code - Chapter I,IITrần Hiếu
 
Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...
Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...
Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...Working in Japan
 
Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Da To
 
Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...
Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...
Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...ITguru.vn
 
3-Requirements_VI.pdf
3-Requirements_VI.pdf3-Requirements_VI.pdf
3-Requirements_VI.pdfEllieHuynh3
 
Agile Scrum for your startup
Agile Scrum for your startupAgile Scrum for your startup
Agile Scrum for your startupKevin Vu
 
Slide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfSlide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfHuyVnh4
 
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?ITguru.vn
 
[Cntt] bài giảng java khtn hcm
[Cntt] bài giảng java   khtn hcm[Cntt] bài giảng java   khtn hcm
[Cntt] bài giảng java khtn hcmHong Phuoc Nguyen
 
Seminar apply OOP in maintain software
Seminar apply OOP in maintain softwareSeminar apply OOP in maintain software
Seminar apply OOP in maintain softwareVKhang Yang
 
mo-hinh-phat-trien.pdf
mo-hinh-phat-trien.pdfmo-hinh-phat-trien.pdf
mo-hinh-phat-trien.pdfZACNguyenHoang
 
Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Thang DV
 
Bai giang c++
Bai giang c++Bai giang c++
Bai giang c++Thang DV
 

Similar to Code Refactoring: Thay đổi nhỏ - Lợi ích lớn (20)

How to write good code
How to write good code How to write good code
How to write good code
 
Itlc2015
Itlc2015Itlc2015
Itlc2015
 
Clean code
Clean codeClean code
Clean code
 
ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...
ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...
ScrumDay Vietnam 2013: Phương pháp luận phần mềm - Truyền thống và Agile - Ng...
 
The art of readable code - Chapter I,II
The art of readable code - Chapter I,IIThe art of readable code - Chapter I,II
The art of readable code - Chapter I,II
 
Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...
Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...
Phuongphapluanduanphanmem truyenthongvaagilengotrungvietscrumday2013-13100720...
 
Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++
 
Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...
Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...
Lập trình viên có thể làm gì nếu đã chán viết code? Đây là 23 công việc khác ...
 
3-Requirements_VI.pdf
3-Requirements_VI.pdf3-Requirements_VI.pdf
3-Requirements_VI.pdf
 
Agile Scrum for your startup
Agile Scrum for your startupAgile Scrum for your startup
Agile Scrum for your startup
 
Slide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfSlide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdf
 
Pbc day-01-introduction
Pbc day-01-introductionPbc day-01-introduction
Pbc day-01-introduction
 
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
 
[Cntt] bài giảng java khtn hcm
[Cntt] bài giảng java   khtn hcm[Cntt] bài giảng java   khtn hcm
[Cntt] bài giảng java khtn hcm
 
Seminar apply OOP in maintain software
Seminar apply OOP in maintain softwareSeminar apply OOP in maintain software
Seminar apply OOP in maintain software
 
mo-hinh-phat-trien.pdf
mo-hinh-phat-trien.pdfmo-hinh-phat-trien.pdf
mo-hinh-phat-trien.pdf
 
Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++
 
Ngon ngu lap_trinh_c__
Ngon ngu lap_trinh_c__Ngon ngu lap_trinh_c__
Ngon ngu lap_trinh_c__
 
Bai giang c++
Bai giang c++Bai giang c++
Bai giang c++
 
Bai giang c++
Bai giang c++Bai giang c++
Bai giang c++
 

More from Nhật Nguyễn Khắc

More from Nhật Nguyễn Khắc (9)

Reflective Learning
Reflective LearningReflective Learning
Reflective Learning
 
Livestream - Nhật ký học lập trình
Livestream - Nhật ký học lập trìnhLivestream - Nhật ký học lập trình
Livestream - Nhật ký học lập trình
 
Livestream - Học lập trình là học gì?
Livestream - Học lập trình là học gì?Livestream - Học lập trình là học gì?
Livestream - Học lập trình là học gì?
 
Hội thảo nghề nghiệp tại CodeGym 6/6/2020
Hội thảo nghề nghiệp tại CodeGym 6/6/2020Hội thảo nghề nghiệp tại CodeGym 6/6/2020
Hội thảo nghề nghiệp tại CodeGym 6/6/2020
 
WHY DO WE REPORT?
WHY DO WE REPORT?WHY DO WE REPORT?
WHY DO WE REPORT?
 
Live stream: Học lập trình
Live stream: Học lập trìnhLive stream: Học lập trình
Live stream: Học lập trình
 
Automation Testing & TDD
Automation Testing & TDDAutomation Testing & TDD
Automation Testing & TDD
 
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
 
Clean code coding like a professional
Clean code   coding like a professionalClean code   coding like a professional
Clean code coding like a professional
 

Code Refactoring: Thay đổi nhỏ - Lợi ích lớn

  • 1. Code Refactoring THAY ĐỔI NHỎ - LỢI ÍCH LỚN
  • 2. Nội dung • Tại sao cần code refactoring • Mã bẩn • Các kỹ thuật refactoring • Demo
  • 3. Tốc độ phát hành phần mềm
  • 4. Tuyên ngôn Agile Chúng tôi đã phát hiện ra cách phát triển phần mềm tốt hơn bằng cách thực hiện nó và giúp đỡ người khác thực hiện. Qua công việc này, chúng tôi đã đi đến việc đánh giá cao: Cá nhân và sự tương tác hơn là quy trình và công cụ; Phần mềm chạy tốt hơn là tài liệu đầy đủ; Cộng tácvới khách hàng hơn là đàm phán hợp đồng; Phản hồi với các thay đổihơn là bám sát kế hoạch. Mặc dù các điều bên phải vẫn còn giá trị, nhưng chúng tôi đánh giá cao hơn các mục ở bên trái. AgileAlliance.org
  • 5. Chuyển giao nhanh Thời gian … Iteration
  • 6. Design is the key, Planned Design is not … • Takeuchi & Nonaka: overlapping is better than sequential Not efficient: • Time consuming • No backward • No “better idea” on the go Làm thế nào để tổ chức kiểu “Overlapping” như thế này?
  • 7. Simple Design là gì? • Design sẽ tiến hoá theo quá trình • KHÔNG cần có design toàn bộ từ đầu. Vừa đủ thôi • Là một phần của quy trình phát triển • Chương trình lớn lên thì design sẽ thay đổi theo • Không phải là chiến thuật “code and fix” 7 Evolve
  • 8. Simplicity Rationale behind Simple Design • ”Tạo ra thứ đơn giản nhất có thể chạy được“ • ”Chúng ta sẽ không bao giờ cần tới nó“ • Đầu tư cho mẫu thiết kế • Hệ thống tối giản 1. Chạy toàn bộ test 2. Rõ mục đích 3. Không trùng lặp 4. Có ít lớp và phương thức nhất có thể 8
  • 9. Thiết kế để Giao tiếp • Vẽ thiết kế ra để thảo luận trong nhóm • Chỉ cần đủ để làm rõ giải pháp • Chỉ nên sử dụng các lưu đồ đơn giản, không mất nhiều công duy trì • Giữ minh bạch các lưu đồ • Treo ở tường • Khuyến khích mọi người cập nhật • Để ý xem liệu mọi người có dùng không, hay là vứt xó 9
  • 10. Thiết kế để Xây dựng • “Phần mềm chạy tốt là thước đo chính về tiến độ” • Thiết kế sẽ được chuyển thành tính năng chạy được, do đó: • Design phải chia ra để code được trong nhóm • Phân tách, interface, giao tiếp giữa các thành phần • Design phải kiểm thử được • “Kiến trúc sư cần phải code” 10
  • 11. Refactoring • Để có thiết kế đơn giản hơn • Duy trì, cập nhật dễ hơn • Là một việc bắt buộc phải làm • Để ý đến mẫu thiết kế và các best practices 11 Image: http://www.testically.org
  • 12. Tái cấu trúc mã nguồn • Tái cấu trúc mã nguồn là các kỹ thuật cho phép chỉnh sửa mã nguồn nội bộ mà không làm thay đổi hành vi của hệ thống đối với bên ngoài • Tái cấu trúc mã nguồn nhằm mục đích chính: • Mã nguồn dễ duy trì hơn • Mã nguồn dễ mở rộng hơn Lưu ý: Tái cấu trúc mã nguồn không phải luôn luôn giúp tăng hiệu năng (performance) của thuật toán. Trong một số trường hợp, có thể cần hy sinh hiệu năng để có được mã nguồn tốt hơn
  • 13. Development Flow Requirement Analysis UI Mocking •Customer discussion Design Draft •Design Discussion Code the skeleton to test the design Coding in team Refactoring and Refinement Build the increment $ DevTeamPO Collaboration: Steps: Artifacts: As a super user, I want to … A B IDo Interface IDo{ //TODO … } Class A{ //TODO … } Class B:IDo{ //TODO … } Interface IDo{ //TODO … } Class A{ method1(){ //Mr. A codes here } } Class B:IDo{ method1(){ //Mrs. B codes here } } Class C{ } $ PO
  • 14. Tiến hoá của các Model com.myapp.Models com.myapp.Views com.myapp.Controllers Sprint 0 updated story V1 M1 IDo C1 V1 M1 IDo C1 V2 M2 Sprint 1 Sprint 2 Product Backlog Items burnt Items burnt Initial Architecture Model1 Model 2
  • 15. “Continuous” Architecting Sprint #1: without layering Presentation Tier Application Layer Business Layer Data Access Layer Data Tier
  • 16. “Continuous” Architecting Sprint #2: refactoring to layers 16 Presentation Tier Application Layer Business Layer Data Access Layer Data Tier
  • 17. “Continuous” Architecting Sprint #3: architecting “on the go” 17 Presentation Tier Application Layer Business Layer Data Access Layer Data Tier
  • 19. Phương thức dài quá Dấu hiệu: • Quá nhiều dòng code • Có quá nhiều tầng code • Độ phức tạp cao Xử lý: • Tách phương thức • Sử dụng Parameter Object • Phân tách các khối lệnh điều kiện 19
  • 20. Lớp to quá Dấu hiệu: • Có quá nhiều trường • Có quá nhiều phương thức • Có quá nhiều dòng code Xử lý: • Tách lớp • Tách lớp con • Tách interface 20
  • 21. Danh sách tham số dài quá Dấu hiệu: • Có nhiều hơn 3 hoặc 4 tham số cho một phương thức Xử lý: • Thay thế tham số bằng lời gọi phương thức • Giữ nguyên object • Truyền vào đối tượng 21
  • 22. Mã bị lặp Dấu hiệu: • Hai hoặc nhiều đoạn mã nhìn gần giống nhau Xử lý: • Tách phương thức • Tách lớp cha • Chuyển thành template method • Thay thế thuật toán 22
  • 23. Ghi chú Dấu hiệu: • Có nhiều ghi chú để giải thích các đoạn mã Xử lý: • Tách biến • Tách phương thức • Thay đổi tên phương thức 23
  • 25. Một số kỹ thuật tái cấu trúc Kỹ thuật đổi tên biến Kỹ thuật đổi tên phương thức Kỹ thuật tách biến Kỹ thuật tách hằng Kỹ thuật tách phương thức
  • 26. Đổi tên biến và phương thức • Thay đổi tên biến hoặc phương thức để trở nên tốt hơn: dễ đọc, có ý nghĩa, thể hiện được ý nghĩa, tuân thủ coding convention • Khi đổi tên biến hoặc phương thức cần lưu ý: • Đổi tên tại vị trí khai báo • Đổi tên tại tất cả các vị trí có sử dụng biến hoặc phương thức • Nên sử dụng tính năng của IDE để đổi tên biến hoặc phương thức
  • 27. Tách biến • Trong nhiều trường hợp, các biểu thức phức tạp sẽ gây khó hiểu • Tách biến (Variable Extraction) là kỹ thuật giúp đơn giản hoá các biểu thức và giúp dễ hiểu hơn
  • 28.
  • 29.
  • 30. Tách biến: Ví dụ kiểm tra năm nhuận function isLeapYear(year) { if(year % 4 == 0){ if (year % 100 == 0){ if(year % 400 == 0) return true; } else { return true; } } return false; } function isLeapYear(year) { varr isDivisibleBy4 = year % 4 == 0; if(isDivisibleBy4){ varr isDivisibleBy100 = year % 100 == 0; if (isDivisibleBy100){ varr isDivisibleBy400 = year % 400 == 0; if(isDivisibleBy400) return true; } else { return true; } } return false; }
  • 31. Tách hằng • Trong nhiều trường hợp, các giá trị “thần kỳ” (magic value) sẽ gây khó khăn cho việc đọc hiểu mã nguồn • Tách hằng giúp mang lại ý nghĩa cho các giá trị “thần kỳ” và mã nguồn dễ hiểu hơn
  • 32. Tách hằng: Ví dụ phân quyền dựa vào role function isAuthorized(var role){ if(role == 1){ return true; } return false; } const ROLE_ADMIN = 1; function isAuthorized(role){ if(role == ROLE_ADMIN){ return true; } return false; }
  • 33. Tách phương thức • Trong nhiều trường hợp, một phương thức quá dài, quá phức tạp hoặc xử lý quá nhiều tác vụ sẽ dẫn đến khó hiểu, khó kiểm soát • Tách phương thức giúp cho các phương thức dễ đọc hiểu hơn, dễ kiểm soát hơn
  • 34.
  • 35.
  • 36. Tách phương thức: Ví dụ tính số ngày function getDaysOfMonth(month, year){ switch (month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; … case 2: var isLeapYear = false; if(year % 4 == 0){ if (year % 100 == 0){ if(year % 400 == 0) isLeapYear = true; } else { isLeapYear = true; } } if(isLeapYear){ return 29; } else { return 28; } default: return 0; }
  • 37. function getDaysOfMonth(month, year){ switch (month){ ….. case 4: case 6: case 9: case 11: return 30; case 2: var isLeapYear = isLeapYear(year); if(isLeapYear){ return 29; } else { return 28; } default: return 0; } } function isLeapYear(year) { var isLeapYear = false; if(year % 4 == 0){ if (year % 100 == 0){ if(year % 400 == 0) isLeapYear = true; } else { isLeapYear = true; } } return isLeapYear; }
  • 39.
  • 40. Refactoring to Patterns • Strategy • Decorator • Command • Template Method • Abstract Builder • …

Editor's Notes

  1. Discuss this list of values before going on further with Scrum
  2. Limit risk to 1 Sprint