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

Nhom1 quan ly du an phan mem
Nhom1 quan ly du an phan memNhom1 quan ly du an phan mem
Nhom1 quan ly du an phan memNgoc Dep
 
Spring framework
Spring frameworkSpring framework
Spring frameworkAn Nguyen
 
cẩm nang lập trình căn bản
cẩm nang lập trình căn bảncẩm nang lập trình căn bản
cẩm nang lập trình căn bảnTuancute
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformBài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformMasterCode.vn
 
Giới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bảnGiới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bảnHuy Nguyen Quang
 
De thi qlda cntt itc vdc trac nghiem 05-2006
De thi qlda cntt itc vdc trac nghiem 05-2006De thi qlda cntt itc vdc trac nghiem 05-2006
De thi qlda cntt itc vdc trac nghiem 05-2006Tran Tien
 
Bai07 bo nho
Bai07   bo nhoBai07   bo nho
Bai07 bo nhoVũ Sang
 
Nhập môn công nghệ phần mềm
Nhập môn công nghệ phần mềmNhập môn công nghệ phần mềm
Nhập môn công nghệ phần mềmTrần Gia Bảo
 
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UMLPHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UMLDang Tuan
 
Kiến trúc máy tính và hợp ngữ bài 08
Kiến trúc máy tính và hợp ngữ bài 08Kiến trúc máy tính và hợp ngữ bài 08
Kiến trúc máy tính và hợp ngữ bài 08Nhóc Nhóc
 
Bài 5: Thiết kế giao diện - Giáo trình FPT
Bài 5: Thiết kế giao diện - Giáo trình FPTBài 5: Thiết kế giao diện - Giáo trình FPT
Bài 5: Thiết kế giao diện - Giáo trình FPTMasterCode.vn
 
Báo cáo xây dựng và phát triển phần mềm
Báo cáo xây dựng và phát triển phần mềmBáo cáo xây dựng và phát triển phần mềm
Báo cáo xây dựng và phát triển phần mềmytthuan
 
Giáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinGiáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinVõ Phúc
 
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
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.commai_non
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnhTùng Trần
 
Thiết kế csdl quản lý nhân sự
Thiết kế csdl quản lý nhân sựThiết kế csdl quản lý nhân sự
Thiết kế csdl quản lý nhân sựleemindinh
 

What's hot (20)

Nhom1 quan ly du an phan mem
Nhom1 quan ly du an phan memNhom1 quan ly du an phan mem
Nhom1 quan ly du an phan mem
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
cẩm nang lập trình căn bản
cẩm nang lập trình căn bảncẩm nang lập trình căn bản
cẩm nang lập trình căn bản
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformBài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winform
 
Giới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bảnGiới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bản
 
De thi qlda cntt itc vdc trac nghiem 05-2006
De thi qlda cntt itc vdc trac nghiem 05-2006De thi qlda cntt itc vdc trac nghiem 05-2006
De thi qlda cntt itc vdc trac nghiem 05-2006
 
Bai07 bo nho
Bai07   bo nhoBai07   bo nho
Bai07 bo nho
 
Nhập môn công nghệ phần mềm
Nhập môn công nghệ phần mềmNhập môn công nghệ phần mềm
Nhập môn công nghệ phần mềm
 
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UMLPHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
 
Kiến trúc máy tính và hợp ngữ bài 08
Kiến trúc máy tính và hợp ngữ bài 08Kiến trúc máy tính và hợp ngữ bài 08
Kiến trúc máy tính và hợp ngữ bài 08
 
Bài 5: Thiết kế giao diện - Giáo trình FPT
Bài 5: Thiết kế giao diện - Giáo trình FPTBài 5: Thiết kế giao diện - Giáo trình FPT
Bài 5: Thiết kế giao diện - Giáo trình FPT
 
Báo cáo xây dựng và phát triển phần mềm
Báo cáo xây dựng và phát triển phần mềmBáo cáo xây dựng và phát triển phần mềm
Báo cáo xây dựng và phát triển phần mềm
 
Lap ke hoach du an
Lap ke hoach du anLap ke hoach du an
Lap ke hoach du an
 
Giáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinGiáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tin
 
NGHIÊN CỨU KHOA HỌC
NGHIÊN CỨU KHOA HỌCNGHIÊN CỨU KHOA HỌC
NGHIÊN CỨU KHOA HỌC
 
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...
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnh
 
Thiết kế csdl quản lý nhân sự
Thiết kế csdl quản lý nhân sựThiết kế csdl quản lý nhân sự
Thiết kế csdl quản lý nhân sự
 
Giáo trình giảng dạy môn Tin sinh học
Giáo trình giảng dạy môn Tin sinh họcGiáo trình giảng dạy môn Tin sinh học
Giáo trình giảng dạy môn Tin sinh học
 

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++
 
Bai giang c++
Bai giang c++Bai giang c++
Bai giang c++
 
Bai giang c++
Bai giang c++Bai giang c++
Bai giang c++
 
C++ PTIT
C++ PTITC++ PTIT
C++ PTIT
 

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