Clean Code Vietnamese | Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh

Clean Code Vietnamese | Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh. Tài liệu gồm 363 trang giúp bạn tham khảo, củng cố kiến thức và ôn tập đạt kết quả cao trong kỳ thi sắp tới. Mời bạn đọc đón xem!

 

Trang 1

Trang 2
Mã sạch

Trang 3
Robert C. Martin Series
 !"#$
%&'( )*+,-.
/!0112$%3
**4'*2)5/6%3074'1829:4-
$%34;)!"%3<12& 
$ "3):0=$;2&0$,8)
:=$5>/"1?@+**2
AB%&=%-11C:01-
AB%&:45/634;*56+D
1"47EB*
Quản lý các dự án Agile
FGH
Lập kế hoạch và ước tính nhanh
I.
Làm việc hiệu quả với Mã kế thừa
I.J
Agile Java ™: Tạo mã với Phát triển theo hướng kiểm tra
KL
Các Nguyên tắc, Mẫu và Thực hành Agile trong C #
M.III
Phát triển phần mềm Agile: Nguyên tắc, Mẫu và Thực hành
M.I
Mã sạch: Sổ tay về nghề thủ công phần mềm Agile
M.I
UML dành cho lập trình viên Java ™
M.I
Phù hợp cho việc phát triển phần mềm: Khung cho các bài kiểm tra tích hợp
MI+N+.
Phát triển phần mềm Agile với SCRUM
OFI9+
Kỹ thuật phần mềm cực đoan: Một cách tiếp cận
PQFPNR
Để biết thêm thông tin, hãy truy cập Informit.com/martinseries

Trang 4
Mã sạch
Sổ tay Agile
Tay nghề phần mềm
Người cố vấn đối tượng:
Robert C. Martin
Michael C. Feathers Timothy R. Ottinger
Jeffrey J. Langr Brett L. Schuchert
James W. Grenning Kevin Dean Wampler
Object Mentor Inc.
Viết mã sạch là những gì bạn phải làm để gọi mình là một người chuyên nghiệp.
Không có lý do hợp lý nào để làm bất cứ điều gì kém hơn khả năng của bạn.
F!S""F++)KT9TU+"TFJ
VTWTITL+TITRTI++
."TF+TWTF"TW"&IX

Trang 5
$845/X=5>Y+47"B"Z-45/1&
;[%840X=&X=4;2$2;)
84;45/4#1\2=
.X=4;,B42Z]&)5!^\
8+56=_3?!]$`\20O!0""8
%D1\+ ,1,42\"@Y+!\
5[30E4B
X=>&4\6&5/647&5/6\
4\)07a"14Yb\3cd'++1
+)14)-B2"]EeXB+*5[fg14721!h
P".e"QO_
ijkklmjnmopq
."r""
A71QO_)g1h
P&,&2
r"+
9ad
UF9kpmnmskjjni"hR"l
pR7"#$tnR#$euA' UW14$
vHwxwxPowImxsnnkkj
kkspu+nn
nkkjknowsk
9,$ynkkqRz+)U
A;4{89,$A5/QO_|"Z45/E,$)
"0*"}"@X=56=_}"]=)5%
&X=)\$+56=_3?\~=_"5[)4Y)[e)"")
B)\5[*A72!$,$);256h
Rz+)U
9'" v$Q/"4a
skpR&9)Fqkk
9)IHknppx
JXhixpwlxwpmoow
UF9pmhqwjkpmnmskjjo
UF9pkhkpmnmskjjn
f{45/QO_1=2.EF)I
U#4#w{nkkj

Trang 6
Đối với Ann Marie: Tình yêu vĩnh cửu của đời tôi.

Trang 7
Trang này cố ý để trống

Trang 8

Nội dung
L>04# X
•6h XX
W13 XXX
Chương 1: Mã sạch p
Sẽ có mã n
Mã lỗi m
Tổng chi phí sở hữu một tin nhắn o
W2261#>s
W4's
.B^0C[x
 v€•x
I;3•w
Các trường phái tư tưởng pn
Chúng tôi là tác giả pm
Quy tắc Hướng đạo sinh po
Phần tiền truyện và nguyên tắc ps
Kết luận: ps
Thư mục ps
Chương 2: Những cái tên có ý nghĩa pw
Giới thiệu: pw
Sử dụng tên có ý định tiết lộ pj
Tránh thông tin pq
Tạo sự khác biệt có ý nghĩa nk
Sử dụng tên có thể phát âm được np
Sử dụng tên có thể tìm kiếm nn

Trang 9

Nội dung
Tránh mã hóa nm
O82Qhnm
W$&1no
•+7no
Tránh lập bản đồ tinh thần ns
Tên lớp ns
Tên phương pháp ns
Đừng dễ thương nx
Chọn một từ cho mỗi khái niệm nx
Đừng chơi chữ nx
Sử dụng tên miền giải pháp nw
Sử dụng tên miền có vấn đề nw
Thêm ngữ cảnh có ý nghĩa nw
Không thêm ngữ cảnh vô cớ nq
Lời cuối mk
Chương 3: Chức năng mp
Nhỏ! mo
.\$ms
Làm một việc ms
."#?{mx
Một mức độ trừu tượng cho mỗi hàm mx
A-;@1X&+56h Quy tắc bước xuống mw
Chuyển đổi câu lệnh mw
Sử dụng tên mô tả mq
Đối số hàm ok
.+4[1op
.>4&&op
.?{P+on
9'on
A&5/ " om
P4&&om
A'@W@0om
Không có tác dụng phụ oo
O2,4&&os
Tách truy vấn lệnh os

Trang 10
X
Nội dung
Ưu tiên các trường hợp ngoại lệ trả lại mã lỗi ox
WeX=&Yb€ox
‚Y8`'4$ow
B"'zGow
Đừng lặp lại chính mình oj
Lập trình có cấu trúc oj
Làm thế nào để bạn viết các hàm như thế này? oq
Kết luận: oq
SetupTeardownIncluder sk
Thư mục sn
Chương 4: Nhận xét sm
Nhận xét không bù đắp cho mã xấu ss
Giải thích về bản thân bằng mã lệnh ss
Ý kiến tốt ss
ƒ2 ""8ss
93 ="!sx
•e84]sx
L„sw
. ,sj
fU…..†L‡Ihsj
O24sq
K+HRU!sq
Nhận xét sai sq
L##sq
 X}@xk
 X}B7#xm
 X}45/,$xm
93 "exm
93 2axo
W2a4/xx
O!Y+3 07Y+
Q\'2xw
P=]exw
A0+=\ X}xw
W'e+gxj

Trang 11
X
Nội dung
I;4; X}xj
 X}QWILxq
W!"4]"5[xq
v$!wk
O2&!„wk
W14$?{wk
K+;!!wp
We+wp
Thư mục wo
Chương 5: Định dạng ws
Mục đích của việc định dạng wx
Định dạng dọc wx
R}"Z+$>ww
A'E$+-%wj
I 4'+-wq
O"5[ˆ4?jk
A\+-jo
Định dạng ngang js
I 4'4'E$jx
.{d$jw
W$jj
Rqk
Nội quy của Đội qk
Quy tắc định dạng của Uncle Bob qk
Chương 6: Đối tượng và cấu trúc dữ liệu qm
Tóm tắt dữ liệu qm
Chống đối xứng dữ liệu / đối tượng qs
Định luật Demeter qw
‚]4€qj
."}"qq
.=CZqq
Đối tượng truyền dữ liệu pkk
94'pkp
Kết luận: pkp
Thư mục pkp

Trang 12
X
Nội dung
Chương 7: Xử lý lỗi pkm
Sử dụng ngoại lệ thay vì mã trả lại pko
Viết Tuyên bố Thử-Bắt-Cuối cùng của Bạn Đầu tiên pks
Sử dụng các ngoại lệ đã bỏ chọn pkx
Cung cấp ngữ cảnh có ngoại lệ pkw
Xác định các loại ngoại lệ theo nhu cầu của người gọi pkw
Xác định dòng chảy bình thường pkq
Đừng trả về giá trị vô nghĩa ppk
Không vượt qua số vô giá ppp
Kết luận: ppn
Thư mục ppn
Chương 8: Ranh giới ppm
Sử dụng mã của bên thứ ba ppo
Khám phá và tìm hiểu ranh giới ppx
Học log4j ppx
Kiểm tra học tập tốt hơn miễn phí ppj
Sử dụng mã chưa tồn tại ppj
Ranh giới sạch pnk
Thư mục pnk
Chương 9: Kiểm tra đơn vị pnp
Ba định luật TDD pnn
Giữ sạch các bài kiểm tra pnm
O7Oe{pno
Kiểm tra sạch pno
!%7$7pnw
W1Z}"pnw
Một xác nhận cho mỗi bài kiểm tra pmk
O4[`7pmp
ĐẦU TIÊN pmn
Kết luận: pmm
Thư mục pmm
Chương 10: Lớp học pms
Tổ chức lớp pmx
A00hpmx

Trang 13
X
Nội dung
Lớp học nên nhỏ! pmx
1€+=pmj
F*€2pok
P32,€2$0^pop
Tổ chức để thay đổi pow
.^*4‰poq
Thư mục psp
Chương 11: Hệ thống psm
Bạn sẽ xây dựng một thành phố như thế nào? pso
Xây dựng riêng một hệ thống khỏi việc sử dụng nó pso
Wepss
X=pss
Q&"'psw
Scaling Up psw
I&,BX1&pxk
Các proxy Java pxp
Khung AOP thuần Java pxm
Các khía cạnh của AspectJ pxx
Chạy thử kiến trúc hệ thống pxx
Tối ưu hóa việc ra quyết định pxw
Sử dụng các tiêu chuẩn một cách khôn ngoan, khi chúng thêm giá trị có thể chứng minh
được pxj
Hệ thống cần ngôn ngữ dành riêng cho miền pxj
Kết luận: pxq
Thư mục pxq
Chương 12: Sự xuất hiện pwp
Làm sạch thông qua thiết kế nổi bật pwp
Quy tắc thiết kế đơn giản 1: Chạy tất cả các bài kiểm tra pwn
Quy tắc thiết kế đơn giản 2–4: Tái cấu trúc lại pwn
Không trùng lặp pwm
Diễn đạt pws
Các lớp và phương thức tối thiểu pwx
Kết luận: pwx
Thư mục pwx
Chương 13: Đồng thời pww
Tại sao lại sử dụng đồng thời? pwj
%#5E,#pwq

Trang 14
X
Nội dung
Thách thức pjk
Nguyên tắc phòng thủ đồng thời pjk
1€4[Špjp
Q,h•6"+%pjp
Q,hFY++%pjp
Q,h.4$14' "&pjn
Biết thư viện của bạn pjn
9'5 "`pjn
Biết các mô hình thực thi của bạn pjm
5>X=5>1+cpjo
5>4-5>2hpjo
.2{&pjo
Cẩn thận với sự phụ thuộc giữa các phương thức đồng bộ hóa pjs
Giữ các phần nhỏ được đồng bộ hóa pjs
Viết đúng mã tắt máy rất khó pjx
Kiểm tra mã phân apjx
‚Y8`=4$"Ba?1pjw
L=;54-4#1pjw
L;aE1+‹7pjw
A\;a074$d45/pjw
.6$a['XY8pjj
.1$pjj
.!;47Y'=pjj
I;0~pjq
W*4'0pjq
Kết luận: pqk
Thư mục pqp
Chương 14: Sàng lọc kế thừa pqm
Thực hiện Args pqo
W!4;4$52• nkk
Args: Bản nháp thô nkp
f3 )!+@npn
f$<{npn
Đối số chuỗi npo
Kết luận: nsk

Trang 15
X
Nội dung
Chương 15: Nội bộ JUnit nsp
Khung JUnit nsn
Kết luận: nxs
Chương 16: Tái cấu trúc ngày nối tiếp nxw
Đầu tiên, làm cho nó hoạt động nxj
Sau đó thực hiện đúng nwk
Kết luận: njo
Thư mục njo
Chương 17: Mùi và phương pháp chẩn đoán njs
Nhận xét njx
.ph Thông tin không phù hợp njx
.nh Nhận xét lỗi thời njx
.mh Nhận xét dư thừa njx
.oh Nhận xét viết kém njw
.sh Mã nhận xét ra njw
Môi trường njw
zph Xây dựng yêu cầu nhiều hơn một bước njw
znh Các thử nghiệm yêu cầu nhiều hơn một bước njw
Chức năng njj
Jph Quá nhiều đối số njj
Jnh Đầu ra đối số njj
Jmh Cờ đối số njj
Joh Chức năng chết njj
Khái quát chung njj
•ph Nhiều ngôn ngữ trong một tệp nguồn njj
•nh Hành vi rõ ràng không được thực hiện njj
•mh Hành vi không chính xác tại ranh giới njq
•oh.,$ an toàn bị ghi đè njq
•sh Sao chép njq
•xh Mã ở mức độ trừu tượng sai nqk
•wh Các lớp cơ sở tùy thuộc vào các phái sinh của chúng nqp
•jh Quá nhiều thông tin nqp
•qh Mã chết nqn
•pkh Tách dọc nqn
•pph Không nhất quán nqn
•pnh Lộn xộn nqm

Trang 16
X
Nội dung
•pmh Khớp nối nhân tạo nqm
•poh Tính năng đố kỵ nqm
•psh Đối số của bộ chọn nqo
•pxh Ý định bị che khuất nqs
•pwh Trách nhiệm không đúng chỗ nqs
•pjh Tĩnh không phù hợp nqx
•pqh Sử dụng các biến giải thích nqx
•nkh Tên chức năng nói lên tác dụng của chúng nqw
•nph Hiểu thuật toán nqw
•nnh Tạo sự phụ thuộc logic về mặt vật lý nqj
•nmh Ưu tiên Đa hình thành If / Else hoặc Switch / Case nqq
•noh Tuân theo các quy ước chuẩn nqq
•nsh Thay thế các số ma thuật bằng các hằng số có tên mkk
•nxh Hãy chính xác mkp
•nwh Cấu trúc so với Công ước mkp
•njh Đóng gói các điều kiện mkp
•nqh Tránh các điều kiện phủ định mkn
•mkh Các chức năng nên làm một việc mkn
•mph Mối ghép tạm thời ẩn mkn
•mnh Đừng tùy tiện mkm
•mmh Đóng gói các điều kiện ranh giới mko
•moh Chỉ nên giảm thiểu các chức năng
Một mức độ trừu tượng mko
•msh Giữ dữ liệu có thể định cấu hình ở mức cao mkx
•mxh Tránh điều hướng chuyển tiếp mkx
Java mkw
Kph Tránh danh sách nhập dài bằng cách sử dụng ký tự đại diện mkw
Knh Không kế thừa các hằng số mkw
Kmh Hằng số so với Enums mkj
Tên mkq
ph Chọn tên mô tả mkq
nh Chọn tên ở mức độ trừu tượng thích hợp mpp
mh Sử dụng Danh pháp Chuẩn khi Có thể mpp
oh Tên rõ ràng mpn
sh Sử dụng tên dài cho phạm vi dài mpn
xh Tránh mã hóa mpn
wh Tên nên mô tả tác dụng phụ. mpm

Trang 17
X
Nội dung
Kiểm tra mpm
Wph Kiểm tra không đầy đủ mpm
Wnh Sử dụng Công cụ Bảo hiểm! mpm
Wmh Đừng bỏ qua những bài kiểm tra tầm thường mpm
Woh Một bài kiểm tra bị bỏ qua là một câu hỏi về sự mơ hồ mpm
Wsh Các điều kiện ranh giới thử nghiệm mpo
Wxh Kiểm tra hoàn toàn gần lỗi mpo
Wwh Các mô hình thất bại đang bộc lộ mpo
Wjh Các mẫu bao phủ thử nghiệm có thể được tiết lộ mpo
Wqh Kiểm tra sẽ nhanh chóng mpo
Kết luận: mpo
Thư mục mps
Phụ lục A: Đồng thời II mpw
Ví dụ về Máy khách / Máy chủ mpw
Impw
W1ampq
vmpq
R#2 mnp
Các con đường thực hiện có thể có mnp
F&45>+Dmnn
AB[mnm
R#2 mnx
Biết thư viện của bạn mnx
O!‰5>*mnx
•""!\mnw
.6"!amnj
Sự phụ thuộc giữa các phương pháp
Có thể phá vỡ mã đồng thời mnq
.]4*=mmk
O0+*1mmk
O0+*1mmn
Tăng thông lượng mmm
We!5/4[ammo
We!5/4amms
Bế tắc mms
L@Dmmx
O0Œ.>mmw

Trang 18
X
Nội dung
O!0,$51mmw
fg>mmw
R•@Dmmw
IE0>4/mmj
R•+*"gmmj
€g>4/mmj
Kiểm tra mã đa luồng mmq
Hỗ trợ công cụ để kiểm tra mã dựa trên `mon
Kết luận: mon
Hướng dẫn: Ví dụ về mã đầy đủ mom
IbI45/4-56mom
IbIY+4$mox
Phụ lục B: org.jfree.date.SerialDate moq
Phụ lục C: Tham khảo chéo về phương pháp chẩn đoán okq
Phần kết opp
Mục lục opm

Trang 19
Trang này cố ý để trống

Trang 20
XX
Lời tựa
I'%t1eC!E4BEAI•K)0[
‰>2Z565>C!I'"#?="+D•K4&6
P%B0!\+e+^45/1€"`2'"W!4;'
04a{=~03Ž5>AIh
Ærlighed i små ting er ikke nogen lille ting
•W*%^!"'^•A0'4$&"c/"6%3!
4;&0E4B%4$^\,-AB'&$%&,B1&
]0D!$^
O2C5L++M2Chúa ở trong từng chi tiếtWe+D6
% " 45[4$g2C" 7"#$)
„26H9!d=31
'4&fB)+M4;C842e%3?5/>
XB+*$2C<4I\)Ž4eB*-
-€Y-!+=22W•9E3%4$^\,-
W•' ‘4+‹C!$WPP)9!4;"~C!4a8~
2C4a40']e,-*"7)\+cC070
#3$eX4$400<3W1)%4$5  5[4&!,-)
E3C!07=" ~10một>47<
 " "2€4#'+*%,$22&%{pqqkchỉ45/C
4ZE
7;4;2=@BW1)*C842@2'2&,-[
$*1"[=_#36A#1)40!,*
^1445/*5E47*0W?)
C^=2=Z)Y!40\\[
,1)\ e'X')X0*,2Ž
'6[A0%3$;
W1)2Cd'"}"Z+"7"#$4\
'"#"#$="sản phẩm4#&5'2C5
'g1[W%FH)-B0
45sản phẩm]5>.C!&6&4'=47X="#$
AB%5>h% "31<) 4@'"ZE

 8\B5>+c47sản phẩmR}"Z+$X=!a:
F<.eX=X=!! 9)'+B$€""
26)$?$F

Trang 21
XX
Lời tựa
W1)!"!!)"#6!!~EX=E
3u\0W"#$)jk’\$[%3C45/-
•93•h4'Y%W3!-B"5[WB4731thân
sử+"#$&)C1<$[5%5>/Yg
!"\[e!!<*!!v8 903
0$điều đó•
f{pqsp)'2" =5/45/-93{=W+iWRIl4;4>
1 90 "3[X= I'%
'eWRI "/"1€45/-sFsF' "/"“ u
E4B!Y+ %•“ •'+.1€ sF 1* 2~E[E
Lu'@!+1]5>"5[WB‰ 
@!+6"#$%1€!"'*-5C91,42
=4$,-=)*"#$&4g^“ 5 h ")*+Be)
<0!"CŽd)$C4Z2]47
4=6 &&5W28sFah
Seiri)\‰?i<•€"X2"‘~2Hl92-?4E4BuY+
"5[""2" 54\1"c/"u=,-9<~4\1& +
!
,-•A-2"5[
Seiton)\{€"i<~•&0•2Hl.0'B0‰5>I(h
Một nơi cho mọi thứ, và mọi thứ ở đúng vị trí của nóI'4;"E4B
4/:3=0u2!)1e47445/0
Seiso)\+-+t"i<•^‘2Hlh•%[!]
+B4)+#•)"2=. E4B03$X
;0 X}+g; X}]Y\&
5[•L^C
Seiketsu)1Z0h0&=$%[:
90<~&0=?4$3$0'";0=,''
*0•%1Z4042@4B•A-2"
Shutsuke)\“ itự“ lA$ 0<0“ 47B
*5>X1"!'5>”4‰
2=" YuB)Yu4-"+&)
:7447&c•4B)&cC!Ž4X42
&‹*1"0'$#,B42'&
_'"ZOC!3!!0WRI)"•
3u>`X=uW40)C!41'
="4'h7Y%'" ]g56C]^)\
5[45[6+#pkkkk+\"5[!4&6*ggW;)
!5[29071'="%)"WRI4‰6
[sk{56h2%`+‹3[@4#I
 ";074-45/Ž,-5007*45/W*&c)
45/66WRI{pqxk) "6'6\

Trang 22
XX
Lời tựa
2%Ž5J+91C)0:C1"#$e
.&4a445/@4#?{\B[47,}2?.0:
C1 " ~&>9?*#)\>3
${A0[2~
.0?6$2)504$3401&B€$4$
2" '&)5C074/' "!@=_2" ~
K"
‹54B!d35>"5[A!$'&–PBHI(!

+4#%>15 We+DF@1@BC
''5E—)5><4X*-•5'"5[&-?4'X=X‘
.gF3•Sạch sẽ bên cạnh sự tin kínhAt"5'!)'6`4'
56"4Š4t"'D0.gF%=4$^3• Người trung thành
trong ít là trung thành trong nhiều.g$?2&>470)
&]e'5>,24]•6‘2")33;0•A
khâu trong thời gian tiết kiệm chínCon chim đầu bắt sâu. Đừng trì hoãn cho đến ngày mai
những gì bạn có thể làm hôm nay. iA08<4#@•5>]&c
‘L420[5="#$. lL2$d
E`%`*^)B'‰76•Cây sồi hùng mạnh từ những quả sồi nhỏ
lớn lên. Q\2$e/"!"g@4['&•Một ounce
phòng ngừa có giá trị một pound chữa bệnh. Mỗi ngày một quả táo, bác sĩ không tới nhà. I;
!a&BXe1+56${0'6[C!)\${0C
!5564B)
\10)7C842@2
2C<4)CŽ3=%250+E%"/

24\Q;<$€Y+MA0seiriA0*C8
-12914\1'2~Y+c'
4\14?4#g
5-4$2)*{0&15 !>2C
O2C5."HX+4ŠD!%D,47
B`4'225'4'Y%^)'f= X*}}
=C&47E1+=2C5–3?6[0745/47D
?+-E5+BW22!@1C!1'
"g'!)5C!C842[)2%=4;>\B="
aY2"Q#2 4$\"%35[*W32C!
%5>
!!A?.CW>5'%2)C=3E*4a&
W5>R"2“pq•J[R"Rf1C~
[!>45/"1)@60*@^
F* B4225 "‰24&6=%`*X=€f3 )07E40
[6E4B)54-&):45/Y472"&
%4$4;4#@B56*>[\&**1e4
•R?6*4‰•
W !)C!5>!%&,B5 $e 
 "3.C!@^;36)!"304;)3]C!
& "$[3?1['+%3C!="

Trang 23
XX
Lời tựa
.&c)*2C82C"hMột xu xấu luôn xuất hiện1?)!
!"Ž5- )*3X&]e="}%;
WE
%!‰?1?FX=R#$9LiProduc-
tion)**˜lC!4;0'&""e=~
7$'%d08<&1=$ 4'`="
.C!&0E2C\!% "3\'&="
11B=5/–65 %5>45/ 1">
!"5[""22)C!=]XC"E]40
)5>2;)1!,?+4[=,'4#+g
RA7e+D&e!pw{56)"5 "B*X=€6
{*4[#W26,5> 745/]&2' &
!B[2%)&"7>%4$4[)
4'%5>4'40.=5/2,4'{0,13u
!d
=_"5["">@1>X&%4' 4[!0<
~C4[#5!0<C+‹+Pc-Ž
2=*<4[2%)Š4t")=_`*5>9^,C3!
55>
W=1)!D5>'5+E"'[)4\
]"5[""2" 2C€a@2?$B{Y+"#$
.&!0$4$40u\)e=)0!„$4$40.&0'[
!4"04'B€!1]4="0"c/"65
%5>**+*1;5RF+)OQ•
H"•I;22‘•I;4[‘#C- WC"
;Z 476~+5[3=C00$
470$=C5[3C!)4$,-"1"+ "5>1&
~22~;f"}"Z+X=+D42
"e)22+D42].C1X;C5'6"&4t"4:
%`*22u225',3)!"'47&<0~;
d&2C*6"&*€2" 2 L.
!*6"&*€2)=0$\;u!"@5/
"5>073=SILM+• 1C =)•We
@5/
P‘~@5/X=XI;& );0:#
WE6'"•K^!)!<4$,-#585>AI
*!1C!d47842%4$^\)g"trung thực%
^
$?A$0<*6;)*64a"C!$
;[2*6B$;C!.C!4;&€2?47
•A7€:[C!=••.C!4;X4];3567
 "•AB!"%&,B%&,B~B
•]I'"5[""45/2]Fe'"#=4$
"•‚•.2C;4$!=*)d+*1**
&=07Sai lầm là con người; để tha thứ, thiêng liêng. WF)C!*-
4$073=.C!!e,#Z3.C!*$;C
!3

Trang 24
XX
Lời tựa
;!>.CE5>d[)X?4[6##
Ž[
42*>402
W$"3)C!=#-*C"4•07 2\~Y:
!Y45/‰?&:{{=)3 !=
CA&6&)0?+*2&=1€L"#$U
4;@=W!4/!e@0^<*2
+4;c"=4=${!d47E1&[g0,
2?-4&6!35B>3=047
26&['C6!3=56C9Y!
F "6%72B€)!Z]+-+t"3
James O. Coplien
I™+")AI

Trang 25
Trang này cố ý để trống

Trang 26
XX
Giới thiệu
.Y4+;•.Y4+4'\!•
WCE"g40•ABd'4;!5>C!4;3='
a
=4$2""*2"•.C4•`)4$D;
C!<4;,•O^4'4!5>,8E"
F6*"}"WQ+
"hbbbbpqnxxbNWJš
ilnkkjJ
F

Trang 27
XX
Giới thiệu
‰C!•L2C074~C:42cánhYbên phải3
42
0{•.B>h*khéo léo
.0"#47-$!h2?!9"445/
2?$1€)D)*-'5>/!2)
Ž"+Ž2?400)€'3~{d
4 "
W!07+ 84X4"W  )-‰47
5[4&4[W-*))!4'5/)&B)
?5)0745/?6e['4#4"5[3A5%!?!
07?=~4X4"*2="=2?
#24704'fD:];#4#112X4"40
I;0!03.C!072=1€•=&•$:
;405E*!i0)47;€4#
X4"l)5401:C!)-
4$40:•
O!A0!"&:4'
Q-2;một công việc khó khăn04g^$[d2?$
1€!D9"đổ mồ hôi09"**0)X
B=9"X%5>*0=9"=-=";
356-9"=-44656,24]=-"
45%,24]#
Q;Z]47{d4-&AB!"'&•=•
074-156.&:C")
làm việc chăm chỉ9:!3• 9:4-;u=$;
f:45/Y47<X4$34C$;404$3
609:45/1#C!!44\CE
6A$:&>!?–5C!<~0: 4
.C!4;&"#I'&5[4#1!Y
 ;)D2;.0$;%
5[)C:04-Q-:Z]"#?
474224\&X&4-"#4#1)C€˜
R#?&"#0[0a'&1?473$
"?"I`1?473' "'&;u&
74‰;0'&=4$;0e=4$[.2
"#dữ dội9:" 4 %5> 
+;9:""Be7;C!4
XX}8+C!47*`4‰C!*P'C>
E3điều này sẽ khiến bạn mất nhiều ngày
R#?&"#5E0'5[+=?+
*7c45/ "1?473OC!4,
;1?473)C!4;-8+4'3+56+

Trang 28
XX
Giới thiệu
\c.C!4;&€7"?e34&6;C!44-
4‰){d47€€8+C!=%3C!=
%3C!4;
O2,'[E2?!C<2)4-
;
.[E2?0]22!4-(
!,1?473"#?&W%1?47340)
C!,B42
Ce4#4@4‰C!4;*6272"42
-%4$
2"5>X=+=\!5h›QnnœA$"}"=bối cảnh
%-404;45/"+2˜O!"B%5>1?
6
=0])40mối quan hệ giữa những khám phá đó và những quyết định rời rạc mà chúng ta
được thực hiện trong khi làm sạch mã trong các nghiên cứu điển hình
A7C"1$%&,40)C!4;4\'2}E&
&7]&-72" 907Y+0473
1@[4;"+'=4]
24-"#4#1"#?^,1?473)3:
4;4-'&•=&•$2"#$&52=
>47!,1?473)@56^)@"C,24]u2
4\3]eC!'B"<c45>C!
<)40:72""C[$$1€)!3)
Q-:!g2?•=&•%Q-:
')0Q-:E'"#  5[*
~'2X4"E'"#E'8e4;40
Sự nhìn nhận
Ảnh minh họa
.[<!)KOH9K] 
%?4t"E4#`5[%?B+
O9)N+.)9GF")MK)•+9)P
W)IJ)!
H]$%?}}!47"#1`5[
.!=4;*$?!${)a$?1
tW2]phần mềm Agile: Nguyên tắc, Mẫu và Thực hành.!=Ž!
4?4#g!=g

Trang 29
Trang này cố ý để trống

Trang 30
XXX
Trên trang bìa
Q313IpkohWF•XIpko~E‚Y%
dC+56mk{W „0' `416\
0&5/'“\>
Q30215E42‰\{,${OPraxis!•W!
6=„Star Trek VI='gEXe4
X‰40O7@40)gXe44;E' "‰2
‰"-‹5E0 eg45/1*c‰H+ 
"1
'"Chiến tranh giữa các vì sao4#1
A$34;g3X,Ipko•W00'B65 
"3'B^5 •W!3057`4 B
=‰`‰mkkkk{E%1O&=_
${07~45>*"•Ž40
.`416&Y'!%5)74‰'"B&6
“&C{5/E = MC n44gZ)5M&5/h
.5˜.01![4#t4056, 45/^;•
Oe56&B07'/8•
Q3Ipko13'
*2/""2‰2
4a]@Qi1"l#4B
3a@,(4F"•
4,i1+56)1"lA0a
3C=„=2D
1W2)Cd3=
562D30.
"3=""#gg
5a)0
g^,"#"3B.
32/"C'3C4;
5@=564B8~04;Ba
'4]4'
ž3hyOe‹-O!F"•

Trang 31
Trang này cố ý để trống

Trang 32
p
1
Mã sạch
944-&38+A#1)' "31W?)&
47E' "31^[W&.C!#% "31^[

Trang 33
n
Chương 1: Mã sạch
AB'&$ "30?4#;.C!:XX}
;@-56.C!:3X&0@1X&)310@
+56cX1,0@fCC)C:2 '
=$$;Q[%)C:07"B%;&;X=
;.C!:22;&fC!:274‰;X=
;&
Sẽ có mã
5>07 ~'&$;~404>4u;40!
g=4$–C1,B42!31#2
W  )'&5>4;/8~C€"2C;A$ 406=;:
45/345/2A[!# "313
-5>:5[3@!&( 
f!8˜.C!:!>^;)E3;4+2
1#•'?4'40)%240!7]^,\@5/0–Q-"
45/d4]fX4]1#'247 07*C
lập trìnhI'4\47( 5 là mã
W!-~?4'@5/!%C:2"{1W!
Ž-~&5/!%+1$:2"{A$
:'4$&50:!^;W  )=!&( 45/2
E="[!%+1$:;˜0D:#
\:)eX)-242?0077
W*0
%5><~'40;40:2=&5-
-'40:"'-!#"e?Q-4-
~'40C:"%`07%3C&3
[%3C!0%`:"077C&42?C
077#45/d4]'[a5[3*4"?e
X
%#40
A$:!>X5>)6=*03)
4;07&!@%[a
W  )2“ $4\1#4;+C=?4$3)340
1#45/d4]„Že?5;074'5Y*
;˜
Q;6~;**!%&cC71#
.C!07!%#61#[ .C!07!
C"C!"BeC"" "/"1#40=Ce?5C!:
!>^4'eX#2u3 :!0;

Trang 34
m
Mã xấu
Mã xấu
•#4B!4;4->*O9Ÿ
&Các mô hình thực hiện. pH=0)•4$
&+*1'$4$h~
=4$;&‘I'$4$mong manh•W!!
4a8˜W!<$4$40'%$4$
:)45/`/,=
2a$C!i!<O24$40l.C!
2;&,-E3C!4;"
4&"0,B6*20
W!2'!)&%{jk)
4;2'?+giết người0="‰2=$
14;Y+0540
_"€4#}+L`!
Y%@"2"W>
{1*&{1W!6!
€"Z'=-!>
4;Y+0'#%.!4;@+
'>€40
Q "“)!\"'%B14#1!40^
1
34;X.B>ˆ4]`/;!Q-4;45"Z42
]5>4;'6`4'6;O-1$e {)
;E1a[42-!7,845/%Đó là điều tồi tệ
mã đã đưa công ty đi xuống.
A;bạn4;>]E47;X=•2' "31
=_34;=E$#W  )C!01
0.C!-0lội.C!',;X=.C!Z,'6`4'
D$Z.C!4=47345>3)-'&/8)'&
&)$%34X–5=%3C=$;!
W=14;]EE;X=f 320•
90&€4!•904'!•.0: .0:=~
!0>47&!–~2":? 62=
>47X0;.0:d=^65[3
&02CQ\074;XX}a4-%?4;,
" ~#2/"!464707
7"#2"W=C4;45/
W=C!4;XX}6`4'C!@404;-470
I'W=C!4$=t„=5[3'X'34',2
4]~
p›9kwœ

Trang 35
o
Chương 1: Mã sạch
'X'g[!W=C!4;0~C!:,+-+t"0.
W=1)%40C52424] L9hSau này không bao giờ bằng
Tổng chi phí sở hữu một tin nhắn
24;' "31[\{)074;
] 47E;'X'5>24; ' " 31
[\{)074;] E;'X'
| 1/363

Preview text:

Trang 1 www.it-ebooks.info Trang 2 Mã sạch www.it-ebooks.info Trang 3 Robert C. Martin Series
Nhiệm vụ của loạt bài này là cải thiện trạng thái của nghệ thuật thủ công phần mềm.
Những cuốn sách trong bộ này là kỹ thuật, thực dụng và quan trọng. Các tác giả là
các thợ thủ công có kinh nghiệm cao và các chuyên gia chuyên viết về những gì
thực sự hoạt động trong thực tế, trái ngược với những gì có thể hoạt động trên lý thuyết. Bạn sẽ đọc
về những gì tác giả đã làm, không phải những gì anh ta nghĩ bạn nên làm. Nếu cuốn sách là
về lập trình, sẽ có rất nhiều mã. Nếu cuốn sách nói về quản lý,
sẽ là rất nhiều trường hợp nghiên cứu từ các dự án thực tế.
Đây là những cuốn sách mà tất cả những học viên nghiêm túc sẽ có trên giá sách của họ.
Đây là những cuốn sách sẽ được ghi nhớ vì đã tạo ra sự khác biệt và hướng dẫn
chuyên nghiệp để trở thành nghệ nhân thực thụ.
Quản lý các dự án Agile Sanjiv Augustine
Lập kế hoạch và ước tính nhanh Mike Cohn
Làm việc hiệu quả với Mã kế thừa Michael C. Feathers
Agile Java ™: Tạo mã với Phát triển theo hướng kiểm tra Jeff Langr
Các Nguyên tắc, Mẫu và Thực hành Agile trong C #
Robert C. Martin và Micah Martin
Phát triển phần mềm Agile: Nguyên tắc, Mẫu và Thực hành Robert C. Martin
Mã sạch: Sổ tay về nghề thủ công phần mềm Agile Robert C. Martin
UML dành cho lập trình viên Java ™ Robert C. Martin
Phù hợp cho việc phát triển phần mềm: Khung cho các bài kiểm tra tích hợp
Rick Mugridge và Ward Cunningham
Phát triển phần mềm Agile với SCRUM
Ken Schwaber và Mike Beedle
Kỹ thuật phần mềm cực đoan: Một cách tiếp cận
Daniel H. Steinberg và Daniel W. Palmer
Để biết thêm thông tin, hãy truy cập Informit.com/martinseries www.it-ebooks.info Trang 4 Mã sạch Sổ tay Agile Tay nghề phần mềm
Người cố vấn đối tượng: Robert C. Martin
Michael C. Feathers Timothy R. Ottinger
Jeffrey J. Langr Brett L. Schuchert
James W. Grenning Kevin Dean Wampler Object Mentor Inc.
Viết mã sạch là những gì bạn phải làm để gọi mình là một người chuyên nghiệp.
Không có lý do hợp lý nào để làm bất cứ điều gì kém hơn khả năng của bạn.
Sông Upper Saddle, NJ • Boston • Indianapolis • San Francisco
New York • Toronto • Montreal • London • Munich • Paris • Madrid
Capetown • Sydney • Tokyo • Singapore • Thành phố Mexico www.it-ebooks.info Trang 5
Nhiều ký hiệu được các nhà sản xuất và người bán sử dụng để phân biệt sản phẩm của họ được tuyên bố là
nhãn hiệu. Nơi những ký hiệu đó xuất hiện trong cuốn sách này và nhà xuất bản đã biết về khiếu nại nhãn hiệu,
các ký hiệu đã được in hoa đầu tiên hoặc viết hoa tất cả.
Các tác giả và nhà xuất bản đã quan tâm đến việc chuẩn bị cuốn sách này, nhưng không bày tỏ hoặc
ngụ ý bảo hành dưới bất kỳ hình thức nào và không chịu trách nhiệm về lỗi hoặc thiếu sót. Không có trách nhiệm pháp lý
cho những thiệt hại ngẫu nhiên hoặc do hậu quả liên quan đến hoặc phát sinh từ việc sử dụng thông tin hoặc chương trình có ở đây.
Nhà xuất bản giảm giá tuyệt vời cho cuốn sách này khi đặt hàng với số lượng lớn để mua số lượng lớn hoặc
bán hàng đặc biệt, có thể bao gồm các phiên bản điện tử và / hoặc bìa tùy chỉnh và nội dung dành riêng cho
kinh doanh, mục tiêu đào tạo, trọng tâm tiếp thị và sở thích xây dựng thương hiệu. Vui lòng liên lạc để biết thêm thông tin:
Doanh nghiệp và Chính phủ Hoa Kỳ (800) 382-3419 Corpsales@pearsontechgroup.com
Để bán hàng bên ngoài Hoa Kỳ, vui lòng liên hệ:
Doanh số bán hàng quốc tế international@pearsoned.com
Bao gồm tài liệu tham khảo và chỉ mục.
ISBN 0-13-235088-2 (pbk .: alk. Paper)
1. Phát triển phần mềm nhanh nhẹn. 2. Phần mềm máy tính — Độ tin cậy. I. Tiêu đề. QA76.76.D47M3652 2008 005.1 — dc22 2008024750
Bản quyền © 2009 Pearson Education, Inc.
Đã đăng ký Bản quyền. Được in tại Hoa Kỳ. Ấn phẩm này được bảo vệ bởi bản quyền,
và phải có sự cho phép từ nhà xuất bản trước bất kỳ hành vi sao chép bị cấm nào, lưu trữ trong
hệ thống truy xuất, hoặc truyền tải dưới bất kỳ hình thức nào hoặc bằng bất kỳ phương tiện nào, điện tử, cơ khí, photocopy,
ghi âm, hoặc tương tự. Để biết thông tin về quyền, hãy viết thư tới: Pearson Education, Inc
Bộ phận Quyền và Hợp đồng 501 Phố Boylston, Suite 900 Boston, MA 02116 Fax: (617) 671-3447 ISBN-13: 978-0-13-235088-4 ISBN-10: 0-13-235088-2
Văn bản được in tại Hoa Kỳ trên giấy tái chế tại Courier ở Stoughton, Massachusetts.
In lần đầu tháng 7 năm 2008 www.it-ebooks.info Trang 6
Đối với Ann Marie: Tình yêu vĩnh cửu của đời tôi. www.it-ebooks.info Trang 7
Trang này cố ý để trống www.it-ebooks.info Trang 8 vii Nội dung L
ời nói đầu ... ...............................................x G
iới thiệu: ................................................... ......................................... xxv T
rên bìa ... ........................................ xxi x C
hương 1: Mã sạch ............................................. ........................... 1 S
ẽ có mã ... ................................. 2 M
ã lỗi ... ................................................... 3 Tổn
g chi phí sở hữu một tin nhắn ........................................... .............4
Thiết kế lại lớn trên bầu trời ............................................ .............. 5
Thái độ................................................. .............................................. 5
Câu hỏi hóc búa cơ bản ... ....................... 6
Nghệ thuật của Quy tắc sạch? ............................................ .......................... 6
Mã sạch là gì? ............................................. ............................. 7 C
ác trường phái tư tưởng ... ............................... 12 C
húng tôi là tác giả ... ..................................... 13 Q
uy tắc Hướng đạo sinh .............................................. ............................... 14 P
hần tiền truyện và nguyên tắc ... ......................... 15 K
ết luận: ................................................... ........................................... 15 Th
ư mục ... ......................................... 15 C
hương 2: Những cái tên có ý nghĩa ............................................. .......... 17 G
iới thiệu: ................................................... ......................................... 17 S
ử dụng tên có ý định tiết lộ ............................................. ............ 18 Tr
ánh thông tin ... .......................... 19 Tạo s
ự khác biệt có ý nghĩa ................................................... ............ 20 S
ử dụng tên có thể phát âm được ... ................... 21 S
ử dụng tên có thể tìm kiếm ... ......................... 22 www.it-ebooks.info Trang 9 viii Nội dung Tr
ánh mã hóa .............................................. .................................. 23
Ký hiệu tiếng Hungary: ................................................... .......................... 23
Tiền tố thành viên ... ............................... 24
Giao diện và triển khai ... ........ 24 Tr
ánh lập bản đồ tinh thần ... ........................ 25
n lớp ... ......................................... 25
n phương pháp ... ..................................... 25 Đ
ừng dễ thương ............................................. ......................................... 26 C
họn một từ cho mỗi khái niệm ............................................. .................. 26 Đ
ừng chơi chữ .............................................. ............................................... 26 S
ử dụng tên miền giải pháp .............................................. ................ 27 S
ử dụng tên miền có vấn đề .............................................. ................ 27 Th
êm ngữ cảnh có ý nghĩa ... ..................... 27 K
hông thêm ngữ cảnh vô cớ ............................................ ............... 29 Lờ
i cuối ... .......................................... 30 C
hương 3: Chức năng .............................................. ........................... 31 N
hỏ! ...................................................... ...................................................... 34
Chặn và thụt lề ................................................... ......................... 35 Làm một vi
ệc ... ........................................ 35
Các phần trong chức năng ... ................. 36 M
ột mức độ trừu tượng cho mỗi hàm ............................................ .36 Đ
ọc mã từ trên xuống dưới: Q
uy tắc bước xuống .................. 37 C
huyển đổi câu lệnh ... ............................... 37 S
ử dụng tên mô tả ... ......................... 39 Đ
ối số hàm .............................................. ............................ 40
Các dạng đơn nguyên chung ................................................... .................. 41
Cờ đối số ... ................................ 41
Chức năng Dyadic ................................................ .............................. 42
Bộ ba ................................................... ............................................... 42
Đối tượng lập luận .............................................. ............................. 43
Danh sách đối số ... ................................. 43
Động từ và Từ khóa ................................................... .......................... 43 K
hông có tác dụng phụ .............................................. ............................. 44
Kết quả đối số .............................................. ............................ 45 Tác
h truy vấn lệnh ................................................... .............. 45 www.it-ebooks.info Trang 10 ix Nội dung Ư
u tiên các trường hợp ngoại lệ trả lại mã lỗi ................................... 46
Trích xuất khối thử / bắt ............................................. .................... 46
Xử lý lỗi là một điều ............................................. ............... 47
Nam châm phụ thuộc Error.java ............................................ .47 Đ
ừng lặp lại chính mình ............................................. ............................ 48 Lập
trình có cấu trúc ... ................... 48 Làm th
ế nào để bạn viết các hàm như thế này? .......................................... 49 K
ết luận: ................................................... ........................................... 49 S
etupTeardownIncluder ............................................. .................... 50 Th
ư mục ... ........................................ 52 C
hương 4: Nhận xét .............................................. ......................... 53 N
hận xét không bù đắp cho mã xấu ....................................... 55 G
iải thích về bản thân bằng mã lệnh .............................................. ...................... 55 Ý kiến tốt
... .................................. 55 Ý kiến phá
p lý ... ............................... 55
Bình luận cung cấp thông tin ... ..................... 56
Giải thích ý định ... ......................... 56
Làm rõ................................................. ..................................... 57
Cảnh báo hậu quả ................................................... ................. 58
VIỆC CẦN LÀM: ................................................... ............................. 58
Khuếch đại ................................................... ................................... 59
Javadocs trong API công khai .............................................. ...................... 59 N
hận xét sai ... .................................... 59
Lầm bầm ... ......................................... 59
Nhận xét thừa ... ...................... 60
Nhận xét gây hiểu lầm .............................................. ...................... 63
Nhận xét được ủy quyền ... ........................ 63
Bình luận tạp chí ................................................... ............................ 63
Bình luận tiếng ồn ... .............................. 64
Tiếng ồn đáng sợ ... ...................................... 66
Không sử dụng bình luận khi bạn có thể sử dụng
Hàm hoặc một biến .............................................. ......................... 67
Dấu vị trí ................................................... ............................... 67
Đóng dấu ngoặc nhận xét .............................................. .................. 67
Thuộc tính và dòng .................... 68 www.it-ebooks.info Trang 11 x Nội dung
Mã đã nhận xét .............................................. ........................ 68
Nhận xét HTML ... ............................ 69
Thông tin phi địa phương .............................................. ....................... 69
Quá nhiều thông tin ............................................... ...................... 70
Kết nối không rõ ràng .............................................. ....................... 70
Tiêu đề chức năng ... .............................. 70
Javadocs trong mã không công khai .............................................. .............. 71
Thí dụ................................................. ........................................... 71 Th
ư mục ... ......................................... 74 C
hương 5: Định dạng .............................................. ........................ 75 M
ục đích của việc định dạng .............................................. .................. 76 Đ
ịnh dạng dọc ................................................... ............................. 76
Phép ẩn dụ về tờ báo ... ................. 77
Độ mở theo chiều dọc giữa các khái niệm .............................................. 78
Mật độ dọc ...................................................... ................................ 79
Khoảng cách theo phương thẳng đứng ................................................ .............................. 80
Đặt hàng dọc ................................................... .............................. 84 Đ
ịnh dạng ngang ... ........................ 85
Mật độ và độ mở theo chiều ngang ............................................. ...... 86
Căn chỉnh theo chiều ngang ................................................ ....................... 87
Thụt lề ................................................... ....................................... 88
Phạm vi giả ... ................................. 90 N
ội quy của Đội ... ........................................... 90 Q
uy tắc định dạng của Uncle Bob .............................................. .............. 90 C
hương 6: Đối tượng và cấu trúc dữ liệu .................................... 93 Tóm tắt d
ữ liệu ... .................................. 93 C
hống đối xứng dữ liệu / đối tượng ............................................ .................. 95 Đ
ịnh luật Demeter .............................................. .............................. 97
Xác tàu bị đắm ................................................ .................................... 98
Các phép lai ... ............................................ 99
Cấu trúc ẩn ... ............................... 99 Đ
ối tượng truyền dữ liệu ................................................... ........................ 100
Bản ghi hoạt động ... ................................. 101 K
ết luận: ................................................... ......................................... 101 Th
ư mục ... ...................................... 101 www.it-ebooks.info Trang 12 xi Nội dung C
hương 7: Xử lý lỗi ............................................. .............. 103 S
ử dụng ngoại lệ thay vì mã trả lại ................................... 104 V iết Tu yên bố T
hử-Bắt-Cuối cùng của Bạn Đ
ầu tiên ....................... 105 S
ử dụng các ngoại lệ đã bỏ chọn ........................................... ................ 106 C
ung cấp ngữ cảnh có ngoại lệ .............................................. ....... 107 X
ác định các loại ngoại lệ theo nhu cầu của người gọi .................. 107 X
ác định dòng chảy bình thường .............................................. ...................... 109 Đ
ừng trả về giá trị vô nghĩa ............................................. ................................. 110 K
hông vượt qua số vô giá ............................................. ..................................... 111 K
ết luận: ................................................... ......................................... 112 Th
ư mục ... ...................................... 112 C
hương 8: Ranh giới .............................................. ...................... 113 S
ử dụng mã của bên thứ ba ............................................. ....................... 114 K
hám phá và tìm hiểu ranh giới .............................................. .116 H
ọc l og4j ................................................ ................................. 116 K
iểm tra học tập tốt hơn miễn phí ............................................ ... 118 S
ử dụng mã chưa tồn tại ........................................... ..... 118 R
anh giới sạch ... .............................. 120 Th
ư mục ... ...................................... 120 C
hương 9: Kiểm tra đơn vị ............................................. .......................... 121 Ba đ
ịnh luật TDD ............................................. ...................... 122 G
iữ sạch các bài kiểm tra ................................................... ........................... 123
Kiểm tra Kích hoạt khả năng ............................................. ...................... 124 K
iểm tra sạch ... ......................................... 124
Ngôn ngữ kiểm tra miền cụ thể ............................................. ... 127
Tiêu chuẩn kép ... .............................. 127 M
ột xác nhận cho mỗi bài kiểm tra .............................................. ............................. 130
Khái niệm đơn cho mỗi bài kiểm tra .............................................. .................... 131 Đ
ẦU TIÊN ... ............................................ 132 K
ết luận: ................................................... ......................................... 133 Th
ư mục ... ...................................... 133 C
hương 10: Lớp học ............................................. ............................ 135 Tổ c
hức lớp ... ............................ 136
Đóng gói: ................................................... ................................ 136 www.it-ebooks.info Trang 13 xii Nội dung Lớ
p học nên nhỏ! ...................................................... ................ 136
Nguyên tắc trách nhiệm duy nhất .............................................. .138
Sự gắn kết................................................. ......................................... 140
Duy trì kết quả gắn kết trong nhiều nhóm nhỏ .................. 141 Tổ c
hức để thay đổi ... ...................... 147
Cách ly khỏi sự thay đổi ................................................... ..................... 149 Th
ư mục ... ...................................... 151 C
hương 11: Hệ thống .............................................. .......................... 153 Bạn
sẽ xây dựng một thành phố như thế nào? ...................................................... ........ 154 X
ây dựng riêng một hệ thống khỏi việc sử dụng nó .................................. 154
Tách chính ................................................... .......................... 155
Nhà máy sản xuất ... ......................................... 155
Hệ thống phụ thuộc .................................................................. ..................... 157 S
caling Up ................................................ .......................................... 157
Mối quan tâm xuyên suốt .............................................. ................... 160 C
ác proxy Java ................................................................ ........................................ 161 K
hung AOP thuần Java .............................................. ............... 163 C
ác khía cạnh của AspectJ ................................................ ................................. 166 C hạy thử kiến tr
úc hệ thống ............................................. ..... 166 Tối
ưu hóa việc ra quyết định ... ................ 167 S
ử dụng các tiêu chuẩn một cách khôn ngoan, khi chúng thêm gi
á trị có thể c hứng minh đượ c ......... 168 H
ệ thống cần ngôn ngữ dành riêng cho miền ..................................... 168 K
ết luận: ................................................... ......................................... 169 Th
ư mục ... ...................................... 169 C
hương 12: Sự xuất hiện .............................................. .................... 171 Làm s
ạch thông qua thiết kế nổi bật ............................................. ... 171 Q
uy tắc thiết kế đơn giản 1: Chạy tất cả các bài kiểm tra ......................................... 172 Q
uy tắc thiết kế đơn giản 2–4: Tái cấu trúc lại .......................................... ..172 K
hông trùng lặp ... ................................... 173 D
iễn đạt ... .......................................... 175 C
ác lớp và phương thức tối thiểu .............................................. ........... 176 K
ết luận: ................................................... ......................................... 176 Th
ư mục ... ...................................... 176 C
hương 13: Đồng thời .............................................. ................ 177 Tại
sao lại sử dụng đồng thời? ...................................................... ......................... 178
Những lầm tưởng và quan niệm sai lầm ................................................... .............. 179 www.it-ebooks.info Trang 14 xiii Nội dung Th
ách thức ... ......................................... 180 N
guyên tắc phòng thủ đồng thời ................................................... ....... 180
Nguyên tắc trách nhiệm đơn lẻ ... ....... 181
Hệ quả: Giới hạn phạm vi dữ liệu ........................................... ..... 181
Hệ quả: Sử dụng bản sao dữ liệu ............................................ ........... 181
Hệ quả: Các chủ đề nên càng độc lập càng tốt ............ 182 Bi
ết thư viện của bạn ... ............................ 182
Bộ sưu tập an toàn theo chuỗi .............................................. ................... 182 Bi
ết các mô hình thực thi của bạn .............................................. ............ 183
Người sản xuất người tiêu dùng............................................... ......................... 184
Người đọc-Người viết: ................................................... ............................... 184
Các triết gia ăn uống ... ....................... 184 C
ẩn thận với sự phụ thuộc giữa các phương thức đồng bộ hóa ................. 185 G
iữ các phần nhỏ được đồng bộ hóa .............................................. .... 185 V
iết đúng mã tắt máy rất khó ..................................... 186 K
iểm tra mã phân l uồng ................................................... ...................... 186
Xử lý các lỗi giả mạo là vấn đề phân luồng ứng viên ................. 187
Lấy mã chưa đọc của bạn làm việc đầu tiên .................................... 187
Làm cho mã luồng của bạn trở nên dễ hiểu ............................................ 187
Đặt mã luồng của bạn có thể điều chỉnh được ............................................. ... 187
Chạy với nhiều luồng hơn bộ xử lý ....................................... 188
Chạy trên các nền tảng khác nhau .............................................. .............. 188
Công cụ mã của bạn để thử và buộc thất bại ............................ 188
Mã hóa bằng tay ... .................................... 189
Tự động hóa ................................................... ..................................... 189 K
ết luận: ................................................... ......................................... 190 Th
ư mục ... ...................................... 191 C
hương 14: Sàng lọc kế thừa ........................................... 193 Th
ực hiện Args .............................................. ........................ 194 T
ôi đã làm điều này như thế nào? ...................................................... ..................... 200 A
rgs: Bản nháp thô ............................................. ........................ 201
Vì vậy, tôi dừng lại ... .................................... 212
Về chủ nghĩa gia tăng ................................................ ......................... 212 Đ
ối số chuỗi ................................................... .............................. 214 K
ết luận: ................................................... ........................................ 250 www.it-ebooks.info Trang 15 xiv Nội dung C
hương 15: Nội bộ JUnit ............................................. ............. 251 K
hung JUnit ............................................... ........................ 252 K
ết luận: ................................................... ......................................... 265 C
hương 16: Tái cấu trúc ngày nối tiếp ......................................... 267 Đ
ầu tiên, làm cho nó hoạt động ... .............................. 268 S
au đó thực hiện đúng .............................................. ............................. 270 K
ết luận: ................................................... ......................................... 284 Th
ư mục ... ...................................... 284 C
hương 17: Mùi và phương pháp chẩn đoán ............................................ .285 N
hận xét ... ......................................... 286 C1: T
hông tin không phù hợp .............................................. ......... 286 C2: Nhận x
ét lỗi thời .............................................. ..................... 286 C3: Nhận x
ét dư thừa .............................................. ................. 286 C4: Nhận x
ét viết kém ............................................. ............. 287 C5: Mã nhận x
ét ra ... ................. 287 M
ôi trường ... ..................................... 287 E 1: X
ây dựng yêu cầu nhiều hơn một bước ......................................... 287 E 2: Các
thử nghiệm yêu cầu nhiều hơn một bước .......................................... 287 C
hức năng ... ........................................... 288 F 1: Q
uá nhiều đối số ............................................. ................... 288 F 2: Đ
ầu ra đối số .............................................. ...................... 288 F 3: Cờ đối
số .............................................. .......................... 288 F 4: Chứ
c năng chết .............................................. ........................... 288 K
hái quát chung ... .............................................. 288 G 1: Nhi
ều ngôn ngữ trong một tệp nguồn .................................. 288 G 2: H
ành vi rõ ràng không được thực hiện ...................................... 288 G 3: H
ành vi không chính xác tại ranh giới ..................................... 289 G 4: Các quyền an t
oàn bị ghi đè .............................................. ................... 289 G 5: Sao c
hép ................................................... ............................... 289 G 6: Mã ở m
ức độ trừu tượng sai ........................................ 290 G 7: Các
lớp cơ sở tùy thuộc vào các phái sinh của chúng ....................... 291 G 8: Q
uá nhiều thông tin ............................................. ................ 291 G 9: Mã c
hết .............................................. ................................. 292 G 10: T
ách dọc .............................................. .................. 292 G 11: Không nhất
quán ................................................... .......................... 292 G 12: L
ộn xộn ........................................... ..................................... 293 www.it-ebooks.info Trang 16 xv Nội dung G 13: Khớp nối
nhân tạo .............................................. ................... 293 G 14: T
ính năng đố kỵ .............................................. ............................ 293 G 15: Đ
ối số của bộ chọn .............................................. .................. 294 G 16: Ý
định bị che khuất .............................................. ....................... 295 G 17: T
rách nhiệm không đúng chỗ .............................................. ......... 295 G 18: T
ĩnh không phù hợp .............................................. ................. 296 G 19: Sử
dụng các biến giải thích ............................................. ....... 296 G 20: T
ên chức năng nói lên tác dụng của chúng .......................... 297 G 21: H
iểu thuật toán ............................................. ........ 297 G 22: T
ạo sự phụ thuộc logic về mặt vật lý ................................... 298 G 23: Ư
u tiên Đa hình thành If / Else hoặc Switch / Case .................... 299 G 24: T
uân theo các quy ước chuẩn ............................................. ... 299 G 25: T
hay thế các số ma thuật bằng các hằng số có tên .................. 300 G 26: H
ãy chính xác .............................................. ................................ 301 G 27: Cấu t
rúc so với Công ước ............................................. ........ 301 G 28: Đ
óng gói các điều kiện .............................................. ....... 301 G 29: T
ránh các điều kiện phủ định ............................................. .... 302 G 30: Các
chức năng nên làm một việc ........................................... 302 G 31: Mối
ghép tạm thời ẩn ............................................. ..... 302 G 32: Đ
ừng tùy tiện ........................................... ...................... 303 G 33: Đ
óng gói các điều kiện ranh giới ........................................ 304 G 34: Chỉ
nên giảm thiểu các chức năng Một
mức độ trừu tượng .............................................. .................. 304 G 35: G
iữ dữ liệu có thể định cấu hình ở mức cao ................................ 306 G 36: T
ránh điều hướng chuyển tiếp ............................................. ...... 306 Java
... ...................................................... ..307 J 1: T
ránh danh sách nhập dài bằng cách sử dụng ký tự đại diện ............................ 307 J 2: Không k
ế thừa các hằng số ........................................... ................. 307 J 3: H
ằng số so với Enums ............................................. .............. 308
n ... ................................................ 309 N 1: Chọn t
ên mô tả ............................................. ......... 309 N 2: Chọn t
ên ở mức độ trừu tượng thích hợp .......... 311 N 3: Sử
dụng Danh pháp Chuẩn khi Có thể ........................... 311 N 4: T
ên rõ ràng .............................................. ................. 312 N 5: Sử
dụng tên dài cho phạm vi dài .......................................... .312 N 6: T
ránh mã hóa .............................................. ........................ 312 N 7: T
ên nên mô tả tác dụng phụ. ..................................... 313 www.it-ebooks.info Trang 17 xvi Nội dung K
iểm tra ... ...................................................... .313 T 1: Ki
ểm tra không đầy đủ .............................................. ......................... 313 T 2: Sử
dụng Công cụ Bảo hiểm! ...................................................... ............. 313 T 3: Đ
ừng bỏ qua những bài kiểm tra tầm thường .......................................... .................. 313 T 4: Một
bài kiểm tra bị bỏ qua là một câu hỏi về sự mơ hồ .................. 313 T 5: Các
điều kiện ranh giới thử nghiệm ............................................. ........... 314 T 6: Ki
ểm tra hoàn toàn gần lỗi ............................................ ........ 314 T 7: Các
mô hình thất bại đang bộc lộ ........................................... .314 T 8: Các
mẫu bao phủ thử nghiệm có thể được tiết lộ ............................... 314 T 9: Ki
ểm tra sẽ nhanh chóng ............................................ ..................... 314 K
ết luận: ................................................... ......................................... 314 Th
ư mục ... ...................................... 315 P
hụ lục A: Đồng thời II ............................................ ............ 317 V
í dụ về Máy khách / Máy chủ .............................................. ........................ 317
Máy chủ ... ...................................... 317
Thêm luồng ... ........................... 319
Quan sát máy chủ .............................................. ....................... 319
Phần kết luận................................................. ..................................... 321 C
ác con đường thực hiện có thể có .............................................. ................ 321
Số đường dẫn .............................................. .............................. 322
Đào sâu hơn ................................................ .............................. 323
Phần kết luận................................................. ..................................... 326 Bi
ết thư viện của bạn ... ....................... 326
Khuôn khổ người thực thi .............................................. ...................... 326
Giải pháp không chặn .................................................................. ................... 327
Các lớp an toàn không theo luồng .............................................. .................... 328
Sự phụ thuộc giữa các phương pháp C
ó thể phá vỡ mã đồng thời .............................................. ............. 329
Chịu đựng thất bại ................................................... .......................... 330
Khóa dựa trên máy khách .............................................. ....................... 330
Khóa dựa trên máy chủ .............................................. ...................... 332 Tăn
g thông lượng .............................................. ..................... 333
Tính toán thông lượng đơn luồng ...................................... 334
Tính toán thông lượng đa luồng .......................................... 335 Bế
tắc ................................................... ............................................ 335
Loại trừ lẫn nhau ................................................ ........................... 336
Khóa & Chờ .................................... 337 www.it-ebooks.info Trang 18 xvii Nội dung
Không có quyền ưu tiên................................................ ................................ 337
Vòng chờ ...................................................... .................................. 337
Phá vỡ loại trừ lẫn nhau ................................................... ............. 337
Mở khóa và chờ đợi .............................................. ...................... 338
Phá vỡ dự phòng ............................................................... ...................... 338
Ngắt vòng chờ đợi ................................................... .................... 338 K
iểm tra mã đa luồng ... .............. 339 H
ỗ trợ công cụ để kiểm tra mã dựa trên c huỗi ................................ 342 K
ết luận: ................................................... ......................................... 342 H
ướng dẫn: Ví dụ về mã đầy đủ ............................................. ............. 343
Máy khách / Máy chủ được đọc trước .............................................. ............... 343
Máy khách / Máy chủ sử dụng chủ đề ............................................. ............. 346 P
hụ lục B: org.jfree.date.SerialDate ...................................... 349 P
hụ lục C: Tham khảo chéo về phương pháp chẩn đoán ........................... 409 P
hần kết ... ............................................... 411 M
ục lục ... ...................................................... ... 413 www.it-ebooks.info Trang 19
Trang này cố ý để trống www.it-ebooks.info Trang 20 xix Lời tựa
Một trong những loại kẹo yêu thích của chúng tôi ở đây ở Đan Mạch là Ga-Jol, có hơi cam thảo mạnh
bổ sung hoàn hảo cho thời tiết ẩm ướt và thường lạnh của chúng tôi. Một phần sức hấp dẫn của Ga-Jol đối với
us Danes là những câu nói khôn ngoan hoặc dí dỏm được in trên nắp của mỗi chiếc hộp. Tôi đã mua một hai-
sáng nay gói đồ ăn ngon và thấy rằng nó mang theo cái nhìn cũ của người Đan Mạch:
Ærlighed i små ting er ikke nogen lille ting .
"Trung thực trong những việc nhỏ không phải là một việc nhỏ." Đó là một điềm tốt phù hợp với những gì tôi
đã muốn nói ở đây. Những điều nhỏ nhặt quan trọng. Đây là một cuốn sách về những mối quan tâm khiêm tốn
mà giá trị của nó vẫn không hề nhỏ.
Kiến trúc sư Ludwig mies van der Rohe cho biết Chúa ở trong từng chi tiết . Trích dẫn này nhớ lại
những lập luận đương đại về vai trò của kiến trúc trong phát triển phần mềm, và
rõ ràng trong thế giới Agile. Bob và tôi thỉnh thoảng thấy mình say mê tham gia
cuộc đối thoại này. Và vâng, mies van der Rohe đã chú ý đến tiện ích và những hình thức vượt thời gian
xây dựng nền tảng kiến trúc vĩ đại. Mặt khác, anh cũng đích thân lựa chọn
mọi tay nắm cửa cho mọi ngôi nhà do anh ấy thiết kế. Tại sao? Bởi vì những điều nhỏ nhặt quan trọng.
Trong “cuộc tranh luận” đang diễn ra của chúng tôi về TDD, Bob và tôi đã phát hiện ra rằng chúng tôi đồng ý rằng
kiến trúc đồ đạc có một vị trí quan trọng trong sự phát triển, mặc dù chúng ta có thể có
tầm nhìn về chính xác điều đó có nghĩa là gì. Tuy nhiên, những điều ngụy biện như vậy tương đối không quan trọng,
bởi vì chúng tôi có thể chấp nhận rằng các chuyên gia có trách nhiệm cho một thời gian để suy nghĩ-
lập và lập kế hoạch khi bắt đầu một dự án. Những quan niệm về thiết kế vào cuối những năm 1990 chỉ được thúc đẩy bởi
các bài kiểm tra và mã đã biến mất từ lâu. Tuy nhiên, sự chú ý đến từng chi tiết là một yếu tố quan trọng hơn
nền tảng của sự chuyên nghiệp hơn bất kỳ tầm nhìn lớn nào. Đầu tiên, đó là thông qua thực hành trong
nhỏ mà các chuyên gia đạt được sự thành thạo và tin tưởng để thực hành nói chung. Thứ hai,
chút nhỏ nhất của kết cấu cẩu thả, của cánh cửa không đóng chặt hoặc hơi
gạch quanh co trên sàn nhà, hoặc thậm chí cả bàn làm việc lộn xộn, hoàn toàn xóa tan sự quyến rũ của
toàn bộ lớn hơn. Đó là những gì về mã sạch.
Tuy nhiên, kiến trúc chỉ là một phép ẩn dụ cho việc phát triển phần mềm và đặc biệt là
một phần của phần mềm cung cấp sản phẩm ban đầu giống như một kiến trúc sư
mang lại một tòa nhà nguyên sơ. Trong những ngày của Scrum và Agile, trọng tâm là nhanh chóng
đưa sản phẩm ra thị trường. Chúng tôi muốn nhà máy chạy với tốc độ cao nhất để sản xuất phần mềm.
Đây là những nhà máy của con người: những lập trình viên suy nghĩ, cảm nhận đang làm việc từ một sản phẩm trở lại-
nhật ký hoặc câu chuyện người dùng để tạo sản phẩm . Phép ẩn dụ về sản xuất luôn tồn tại mạnh mẽ trong
Suy nghĩ. Các khía cạnh sản xuất của sản xuất ô tô Nhật Bản, của một dây chuyền lắp ráp
thế giới, truyền cảm hứng cho nhiều Scrum. www.it-ebooks.info Trang 21 xx Lời tựa
Tuy nhiên, ngay cả trong ngành công nghiệp ô tô, phần lớn công việc không nằm ở sản xuất mà là ở
bảo trì — hoặc tránh nó. Trong phần mềm, 80% hoặc nhiều hơn những gì chúng ta làm được gọi là
"Bảo trì": hành động sửa chữa. Thay vì ôm trọng tâm của phương Tây điển hình trên thân
sử
dụng phần mềm tốt, chúng ta nên suy nghĩ nhiều hơn như những người thợ sửa nhà trong tòa nhà
công nghiệp hoặc cơ khí ô tô trong lĩnh vực ô tô. Quản lý Nhật Bản có gì
nói về điều đó ?
Vào khoảng năm 1951, một cách tiếp cận chất lượng được gọi là Bảo trì Năng suất Toàn diện (TPM) đã ra đời
trên cảnh Nhật Bản. Nó tập trung vào bảo trì hơn là sản xuất. Một trong những
trụ cột chính của TPM là tập hợp các nguyên tắc được gọi là 5S. 5S là một tập hợp các kỷ luật — và
ở đây tôi sử dụng thuật ngữ "kỷ luật" một cách giảng dạy. Các nguyên tắc 5S này trên thực tế nằm ở cơ sở-
tions of Lean — một từ thông dụng khác trên thị trường phương Tây và ngày càng nổi bật
từ thông dụng trong giới phần mềm. Những nguyên tắc này không phải là một lựa chọn. Như chú Bob liên quan đến
vấn đề quan trọng của anh ấy, thực hành phần mềm tốt đòi hỏi kỷ luật như vậy: tập trung, sự hiện diện của tâm trí,
và suy nghĩ. Nó không phải lúc nào cũng chỉ là làm, về việc thúc đẩy thiết bị nhà máy để
đấu với vận tốc tối ưu. Triết lý 5S bao gồm các khái niệm sau:
Seiri , hoặc tổ chức (nghĩ “sắp xếp” bằng tiếng Anh). Biết mọi thứ đang ở đâu — sử dụng
các phương pháp tiếp cận như đặt tên phù hợp — là rất quan trọng. Bạn nghĩ rằng việc đặt tên cho số nhận dạng không
quan trọng? Đọc tiếp trong các chương sau.
Seiton , hoặc ngăn nắp (nghĩ rằng "hệ thống hóa" trong tiếng Anh). Có một câu nói cổ của người Mỹ:
Một nơi cho mọi thứ, và mọi thứ ở đúng vị trí của nó . Một đoạn mã phải ở đâu
bạn mong đợi sẽ tìm thấy nó — và nếu không, bạn nên tính toán lại để đạt được nó.
Seiso , hoặc dọn dẹp (nghĩ là “tỏa sáng” trong tiếng Anh): Giữ cho nơi làm việc không bị treo
dây điện, dầu mỡ, phế liệu và chất thải. Các tác giả ở đây nói gì về việc xả rác của bạn
mã có nhận xét và dòng mã nhận xét ghi lại lịch sử hoặc mong muốn
tương lai? Loại bỏ chúng.
Seiketsu , hay tiêu chuẩn hóa: Nhóm thống nhất về cách giữ cho nơi làm việc sạch sẽ.
Bạn có nghĩ rằng cuốn sách này nói bất cứ điều gì về việc có một phong cách mã hóa nhất quán và một bộ
thực hành trong nhóm? Những tiêu chuẩn đó đến từ đâu? Đọc tiếp.
Shutsuke , hoặc kỷ luật ( tự kỷ luật ). Điều này có nghĩa là có kỷ luật để tuân theo
thực hành và thường xuyên phản ánh công việc của một người và sẵn sàng thay đổi.
Nếu bạn chấp nhận thử thách — vâng, thử thách — khi đọc và áp dụng cuốn sách này,
bạn sẽ hiểu và đánh giá cao điểm cuối cùng. Ở đây, cuối cùng chúng tôi cũng đang lái xe đến
gốc rễ của sự chuyên nghiệp có trách nhiệm trong một nghề cần quan tâm đến cuộc sống
chu kỳ của một sản phẩm. Khi chúng tôi bảo trì ô tô và các máy móc khác theo TPM, phá vỡ-
giảm bảo trì — chờ lỗi xuất hiện — là ngoại lệ. Thay vào đó, chúng tôi đi lên một
cấp độ: kiểm tra máy hàng ngày và sửa chữa các bộ phận bị mòn trước khi chúng bị hỏng, hoặc
tương đương với việc thay dầu 10.000 dặm theo phương ngôn đối với sự hao mòn và hao mòn. Trong mã,
refactor không thương tiếc. Bạn có thể cải thiện thêm một cấp nữa, khi phong trào TPM đổi mới-
hơn 50 năm trước: chế tạo những cỗ máy dễ bảo trì hơn ngay từ đầu. Mak-
việc nhập mã của bạn có thể đọc được cũng quan trọng như làm cho nó có thể thực thi được. Thực hành cuối cùng,
được giới thiệu trong giới TPM vào khoảng năm 1960, là tập trung vào việc giới thiệu toàn bộ máy mới hoặc www.it-ebooks.info Trang 22 xxi Lời tựa
thay thế những cái cũ. Như Fred Brooks khuyên chúng ta, có lẽ chúng ta nên làm lại phần mềm chính-
Các khối đồ đạc được làm từ đầu cứ sau bảy năm hoặc lâu hơn để quét sạch các vết rạn nứt. Có lẽ
chúng ta nên cập nhật hằng số thời gian của Brooks thành thứ tự tuần, ngày hoặc giờ thay vì
nhiều năm. Đó là nơi chi tiết nằm.
Có sức mạnh to lớn về chi tiết, nhưng có điều gì đó khiêm tốn và sâu sắc về điều này
cách tiếp cận cuộc sống, như chúng ta có thể mong đợi một cách rập khuôn từ bất kỳ cách tiếp cận nào cho rằng Japa-
rễ nese. Nhưng đây không chỉ là cách nhìn của người phương Đông về cuộc sống; Dân gian Anh và Mỹ khôn ngoan-
dom đầy những lời khuyên nhủ như vậy. Trích dẫn Seiton từ trên chảy ra từ cây bút của
một bộ trưởng Ohio, người theo nghĩa đen xem sự gọn gàng “như một phương thuốc cho mọi mức độ xấu xa.”
Còn Seiso thì sao? Sạch sẽ bên cạnh sự tin kính . Đẹp như một ngôi nhà, một mớ hỗn độn
cái bàn cướp đi vẻ đẹp lộng lẫy của nó. Còn Shutsuke trong những vấn đề nhỏ này thì sao? Người trung thành
trong ít là trung thành trong nhiều
. Còn về việc háo hức tái yếu tố vào thời điểm có trách nhiệm,
củng cố vị trí của một người cho các quyết định “lớn” tiếp theo, thay vì trì hoãn nó? A
khâu trong thời gian tiết kiệm chín
. Con chim đầu bắt sâu. Đừng trì hoãn cho đến ngày mai
những gì bạn có thể làm hôm nay.
(Đó là ý nghĩa ban đầu của cụm từ “người chịu trách nhiệm cuối cùng
moment ”trong Lean cho đến khi nó rơi vào tay các nhà tư vấn phần mềm . ) Làm thế nào về hiệu chỉnh-
ở chỗ của những nỗ lực nhỏ, cá nhân trong một tổng thể lớn? Cây sồi hùng mạnh từ những quả sồi nhỏ
lớn lên.
Hoặc làm thế nào về việc tích hợp công việc phòng ngừa đơn giản vào cuộc sống hàng ngày? Một ounce
phòng ngừa có giá trị một pound chữa bệnh. Mỗi ngày một quả táo, bác sĩ không tới nhà.
Mã sạch
tôn vinh nguồn gốc sâu xa của trí tuệ bên dưới nền văn hóa rộng lớn hơn của chúng tôi, hoặc nền văn hóa của chúng tôi như trước đây,
hoặc nên có, và thể chú ý đến từng chi tiết.
Ngay cả trong các tài liệu kiến trúc vĩ đại, chúng ta cũng tìm thấy những chiếc cưa có tác dụng trở lại những phụ trợ này
chi tiết đặt ra. Hãy nghĩ về tay nắm cửa của mies van der Rohe. Đó là seiri . Đó là sự chú ý
cho mọi tên biến. Bạn nên đặt tên cho một biến bằng cách sử dụng cùng một cách mà bạn
đặt tên cho đứa con đầu lòng.
Như mọi chủ nhà đều biết, sự chăm sóc và trau chuốt liên tục như vậy không bao giờ kết thúc.
Kiến trúc sư Christopher Alexander - cha đẻ của các mẫu và ngôn ngữ mẫu - quan điểm
bản thân mỗi hành động thiết kế như một hành động sửa chữa nhỏ, cục bộ. Và anh ấy xem sự khéo léo của
cấu trúc tốt để trở thành mục tiêu duy nhất của kiến trúc sư; các hình thức lớn hơn có thể được để lại cho các mẫu
và ứng dụng của họ bởi cư dân. Thiết kế không ngừng liên tục khi chúng tôi thêm một
phòng của một ngôi nhà, nhưng khi chúng tôi chú ý đến việc sơn lại, thay thế những tấm thảm đã sờn hoặc nâng cấp
trong bồn rửa nhà bếp. Hầu hết các nghệ thuật đều lặp lại những tình cảm tương tự. Trong tìm kiếm của chúng tôi cho những người khác
mô tả ngôi nhà của Đức Chúa Trời như là một trong những chi tiết, chúng ta thấy mình ở trong sự đồng hành tốt của
Tác giả người Pháp thế kỷ 19 Gustav Flaubert. Nhà thơ Pháp Paul Valery khuyên chúng ta rằng
bài thơ không bao giờ được hoàn thành và phải làm lại liên tục, và ngừng làm việc với nó là sự từ bỏ.
Sự bận tâm đến chi tiết như vậy là phổ biến đối với tất cả những nỗ lực xuất sắc. Vì vậy, có thể ở đó
hơi mới ở đây, nhưng khi đọc cuốn sách này, bạn sẽ được thử thách để tiếp thu tốt
những điều mà bạn đã đầu hàng từ lâu trước sự thờ ơ hoặc mong muốn sự tự nhiên và chính đáng
"Phản ứng với sự thay đổi."
Thật không may, chúng tôi thường không coi những mối quan tâm như vậy là nền tảng chính của nghệ thuật
lập trình. Chúng tôi từ bỏ mã của mình sớm, không phải vì nó đã hoàn thành, mà vì giá trị của chúng tôi
hệ thống tập trung nhiều hơn vào hình thức bên ngoài hơn là nội dung của những gì chúng tôi cung cấp. www.it-ebooks.info Trang 23 xxii Lời tựa
Cuối cùng, sự thiếu chú ý này khiến chúng ta phải trả giá: Một xu xấu luôn xuất hiện . Nghiên cứu, không trong
trong ngành công nghiệp cũng như trong học thuật, tự hạ mình xuống vị trí thấp kém của việc giữ mã trong sạch. Trở lại
trong những ngày tôi làm việc trong tổ chức Nghiên cứu Sản xuất Phần mềm Bell Labs ( Produc-
tion
, thực sự!) chúng tôi đã có một số phát hiện phía sau cho thấy rằng
kiểu thụt lề là một trong những chỉ báo có ý nghĩa thống kê nhất về mật độ lỗi thấp.
Chúng tôi muốn nó trở thành kiến trúc hoặc ngôn ngữ lập trình hoặc một số khái niệm cao cấp khác
nên là nguyên nhân của chất lượng; với tư cách là những người được cho là chuyên nghiệp nhờ vào
thành thạo các công cụ và phương pháp thiết kế cao cả, chúng tôi cảm thấy bị xúc phạm bởi giá trị mà nhà máy đó-
máy sàn, người viết mã, thêm vào thông qua ứng dụng đơn giản nhất quán của một thụt đầu dòng
Phong cách. Để trích dẫn cuốn sách của chính tôi 17 năm trước, phong cách như vậy phân biệt sự xuất sắc với
năng lực đơn thuần. Thế giới quan của người Nhật hiểu được giá trị cốt yếu của cuộc sống hàng ngày
công nhân và hơn thế nữa, của các hệ thống phát triển nhờ vào những điều đơn giản, hàng ngày
hành động của những người lao động đó. Chất lượng là kết quả của hàng triệu hành động chăm sóc quên mình — không chỉ của
bất kỳ phương pháp tuyệt vời nào từ trên trời giáng xuống. Những hành động này đơn giản không có nghĩa là
rằng chúng đơn giản và hầu như không có nghĩa là chúng dễ dàng. Dù sao họ cũng là
kết cấu của sự vĩ đại và hơn thế nữa, của vẻ đẹp, trong bất kỳ nỗ lực nào của con người. Bỏ qua chúng thì không
chưa hoàn toàn là con người.
Tất nhiên, tôi vẫn là người ủng hộ tư duy ở phạm vi rộng hơn, và đặc biệt là
giá trị của các phương pháp tiếp cận kiến trúc bắt nguồn từ kiến thức miền sâu và khả năng sử dụng phần mềm.
Cuốn sách không nói về điều đó — hoặc, ít nhất, nó không rõ ràng về điều đó. Cuốn sách này có một cái hay hơn
thông điệp có độ sâu sắc không nên bị đánh giá thấp. Nó phù hợp với cưa hiện tại
của những người thực sự dựa trên mã như Peter Sommerlad, Kevlin Henney và Giovanni
Asproni. “Mã là thiết kế” và “Mã đơn giản” là thần chú của họ. Trong khi chúng ta phải
hãy cẩn thận để nhớ rằng giao diện là chương trình và cấu trúc của nó có nhiều
để nói về cấu trúc chương trình của chúng tôi, điều quan trọng là phải liên tục áp dụng lập trường khiêm tốn
rằng thiết kế nằm trong mã. Và trong khi làm lại trong phép ẩn dụ sản xuất dẫn đến
chi phí, làm lại trong thiết kế dẫn đến giá trị. Chúng ta nên xem mã của chúng ta như một khớp nối đẹp đẽ
những nỗ lực cao cả của thiết kế — thiết kế như một quá trình, không phải là một điểm cuối tĩnh. Nó nằm trong mã
các chỉ số kiến trúc của sự khớp nối và sự gắn kết phát ra. Nếu bạn nghe Larry Constan-
tine mô tả sự khớp nối và sự gắn kết, anh ấy nói về mặt mã — không phải khái niệm trừu tượng cao cả-
cepts mà người ta có thể tìm thấy trong UML. Richard Gabriel khuyên chúng ta trong bài luận của anh ấy, “Tính trừu tượng
Descant ”rằng trừu tượng là xấu xa. Mã là chống lại cái ác, và mã sạch có lẽ là thần thánh.
Trở lại với hộp Ga-Jol nhỏ của tôi, tôi nghĩ điều quan trọng cần lưu ý là người Đan Mạch
sự khôn ngoan khuyên chúng ta không chỉ để ý đến những điều nhỏ nhặt, mà còn phải trung thực trong những việc nhỏ.
nhiều thứ. Điều này có nghĩa là trung thực với mã, trung thực với đồng nghiệp của chúng tôi về trạng thái
mã và hơn hết là trung thực với bản thân về mã của chúng tôi. Chúng tôi đã cố gắng hết sức để
"Để khu cắm trại sạch sẽ hơn chúng tôi thấy"? Chúng tôi đã xác định lại mã của mình trước khi kiểm tra-
nhập vào? Đây không phải là những mối quan tâm ngoại vi mà là những mối quan tâm nằm ngay trung tâm của
Giá trị linh hoạt. Một phương pháp được khuyến nghị trong Scrum là tính toán lại là một phần của vấn đề
cept của "Xong." Cả kiến trúc và mã sạch đều không nhấn mạnh vào sự hoàn hảo, chỉ dựa trên sự trung thực
và làm tốt nhất có thể. Sai lầm là con người; để tha thứ, thiêng liêng. Trong Scrum, chúng tôi thực hiện mọi-
điều có thể nhìn thấy. Chúng tôi không khí quần áo bẩn của mình. Chúng tôi trung thực về trạng thái mã của chúng tôi vì www.it-ebooks.info Trang 24 xxiii Lời tựa
mã không bao giờ là hoàn hảo. Chúng ta trở thành con người hoàn chỉnh hơn, xứng đáng hơn với thần thánh và gần gũi hơn
đến sự tuyệt vời đó trong các chi tiết.
Trong nghề nghiệp của mình, chúng tôi rất cần mọi sự giúp đỡ có thể. Nếu mặt bằng cửa hàng sạch sẽ
giảm tai nạn và các công cụ cửa hàng được tổ chức tốt sẽ tăng năng suất, vì vậy tôi là tất cả
chúng. Đối với cuốn sách này, nó là ứng dụng thực tế tốt nhất của các nguyên tắc Lean vào phần mềm I
đã từng thấy trong bản in. Tôi mong đợi không ít từ nhóm nhỏ suy nghĩ thực tế này.
các viduals đã cùng nhau phấn đấu trong nhiều năm không chỉ để trở nên tốt hơn mà còn là món quà
kiến thức của họ đối với ngành trong các công trình như bây giờ bạn tìm thấy trong tay của bạn. Nó để lại
thế giới tốt hơn một chút so với tôi tìm thấy trước khi chú Bob gửi cho tôi bản thảo.
Sau khi hoàn thành bài tập này với những hiểu biết sâu sắc, tôi chuẩn bị dọn dẹp bàn làm việc của mình. James O. Coplien Mørdrup, Đan Mạch www.it-ebooks.info Trang 25
Trang này cố ý để trống www.it-ebooks.info Trang 26 xxv Giới thiệu
Cửa nào đại diện cho mã của bạn? Cánh cửa nào đại diện cho đội của bạn hoặc công ty của bạn?
Tại sao chúng ta lại ở trong phòng đó? Đây chỉ là một đánh giá mã thông thường hay chúng tôi đã tìm thấy một luồng
vấn đề khủng khiếp ngay sau khi phát trực tiếp? Chúng ta đang gỡ lỗi trong hoảng loạn, đang nghiền ngẫm mã
mà chúng tôi nghĩ đã hiệu quả? Khách hàng bỏ đi ngày một đông và người quản lý thở phào
Sao lại với sự cho phép của Thom Holwerda.
http://www.osnews.com/story/19266/WTFs_m (c) 2008 F ocus Shift www.it-ebooks.info Trang 27 xxvi Giới thiệu
cổ của chúng tôi? Làm thế nào chúng ta có thể đảm bảo rằng chúng ta sẽ đến sau cánh cửa bên phải khi hành trình đến
khó khăn? Câu trả lời là: sự khéo léo .
Có hai phần để học nghề thủ công: kiến thức và công việc. Bạn phải đạt được
kiến thức về các nguyên tắc, mẫu, thực hành và kinh nghiệm học mà một người thợ thủ công biết, và
bạn cũng phải mài dũa kiến thức đó vào ngón tay, mắt và ruột của mình bằng cách làm việc chăm chỉ và đang luyện tập.
Tôi có thể dạy bạn vật lý của việc đi xe đạp. Thật vậy, toán học cổ điển là
tương đối đơn giản. Trọng lực, ma sát, mô men động lượng, khối tâm, v.v.
thứ tư, có thể được chứng minh với ít hơn một trang đầy đủ các phương trình. Đưa ra những công thức tôi
có thể chứng minh cho bạn thấy rằng đi xe đạp là thực tế và cung cấp cho bạn tất cả kiến thức mà bạn
cần thiết để làm cho nó hoạt động. Và bạn vẫn sẽ bị ngã trong lần đầu tiên leo lên chiếc xe đạp đó.
Mã hóa không có gì khác biệt. Chúng tôi có thể viết ra tất cả các nguyên tắc "cảm thấy tốt" về sạch sẽ
mã và sau đó tin tưởng bạn thực hiện công việc (nói cách khác, để bạn gục ngã khi bắt đầu
xe đạp), nhưng sau đó loại giáo viên nào sẽ tạo ra chúng tôi, và loại học sinh
điều đó sẽ làm cho bạn?
Không. Đó không phải là cách mà cuốn sách này sẽ hoạt động.
Học cách viết mã sạch là một công việc khó khăn . Nó đòi hỏi nhiều hơn là chỉ kiến thức về
nguyên tắc và khuôn mẫu. Bạn phải đổ mồ hôi cho nó. Bạn phải tự thực hành nó, và xem
bản thân thất bại. Bạn phải xem những người khác thực hành nó và thất bại. Bạn phải thấy họ vấp ngã và
tìm lại các bước của họ. Bạn phải thấy họ đau đớn trước các quyết định và thấy cái giá họ phải trả
đưa ra những quyết định sai lầm.
Hãy chuẩn bị để làm việc chăm chỉ khi đọc cuốn sách này. Đây không phải là một cuốn sách "cảm thấy hay"
bạn có thể đọc trên máy bay và hoàn thành trước khi hạ cánh. Cuốn sách này sẽ giúp bạn làm việc,
làm việc chăm chỉ
. Bạn sẽ làm công việc gì? Bạn sẽ đọc mã — rất nhiều mã.
Và bạn sẽ được thử thách để nghĩ xem điều gì đúng về mã đó và điều gì sai
với nó. Bạn sẽ được yêu cầu làm theo khi chúng tôi tách các mô-đun ra và đặt chúng trở lại
lại với nhau. Điều này sẽ tốn thời gian và công sức; nhưng chúng tôi nghĩ rằng nó sẽ đáng giá.
Chúng tôi đã chia cuốn sách này thành ba phần. Một số chương đầu tiên mô tả các hoàng tử-
mật mã, các mẫu và cách viết mã sạch. Có khá nhiều mã trong những
các chương, và chúng sẽ khó đọc. Họ sẽ chuẩn bị cho bạn phần thứ hai
để đến. Nếu bạn đặt cuốn sách xuống sau khi đọc phần đầu tiên, chúc bạn may mắn!
Phần thứ hai của cuốn sách là phần khó hơn. Nó bao gồm một số nghiên cứu điển hình về
ngày càng phức tạp. Mỗi nghiên cứu điển hình là một bài tập trong việc làm sạch một số mã — trong số
chuyển đổi mã có một số vấn đề thành mã có ít vấn đề hơn. Các chi tiết trong
phần này là dữ dội . Bạn sẽ phải lật đi lật lại giữa tường thuật và
danh sách mã. Bạn sẽ phải phân tích và hiểu mã chúng tôi đang làm việc và
xem xét lý do của chúng tôi để thực hiện mỗi thay đổi chúng tôi thực hiện. Dành một chút thời gian
bởi vì điều này sẽ khiến bạn mất nhiều ngày .
Phần thứ ba của cuốn sách này là phần thưởng. Nó là một chương duy nhất chứa danh sách các heu-
sự mạo hiểm và mùi được thu thập trong khi tạo ra các nghiên cứu điển hình. Khi chúng tôi đi qua và
làm sạch mã trong các nghiên cứu điển hình, chúng tôi đã ghi lại mọi lý do cho các hành động của mình dưới dạng www.it-ebooks.info Trang 28 xxvii Giới thiệu
heuristic hoặc mùi. Chúng tôi đã cố gắng hiểu phản ứng của chính mình đối với mã chúng tôi đang đọc
và thay đổi, và làm việc chăm chỉ để nắm bắt lý do tại sao chúng tôi cảm thấy những gì chúng tôi cảm thấy và làm
những gì chúng tôi đã làm.
Kết quả là một cơ sở kiến thức mô tả cách chúng ta suy nghĩ khi viết, đọc và mã sạch.
Cơ sở kiến thức này có giá trị hạn chế nếu bạn không đọc kỹ
thông qua các nghiên cứu điển hình trong phần thứ hai của cuốn sách này. Trong những nghiên cứu điển hình đó, chúng tôi quan tâm đến-
chú thích đầy đủ từng thay đổi mà chúng tôi đã thực hiện với các tham chiếu chuyển tiếp đến kinh nghiệm
học. Những điều này cho-
tham chiếu phường xuất hiện trong dấu ngoặc vuông như sau: [H22]. Điều này cho phép bạn thấy bối cảnh trong
mà những kinh nghiệm học đó đã được áp dụng và viết ra! Không phải bản thân những người nghiên cứu kinh nghiệm mới là
rất có giá trị, đó là mối quan hệ giữa những khám phá đó và những quyết định rời rạc mà chúng ta
được thực hiện trong khi làm sạch mã trong các nghiên cứu điển hình
.
Để giúp bạn thêm về những mối quan hệ đó, chúng tôi đã đặt một tham chiếu chéo ở cuối
của cuốn sách hiển thị số trang cho mọi tài liệu tham khảo chuyển tiếp. Bạn có thể sử dụng nó để nhìn
lên từng nơi đã áp dụng một kinh nghiệm nhất định.
Nếu bạn đọc phần đầu tiên và phần thứ ba và bỏ qua các nghiên cứu điển hình, thì bạn sẽ
đã đọc một cuốn sách "cảm thấy tốt" khác về cách viết phần mềm tốt. Nhưng nếu bạn lấy
thời gian để làm việc thông qua các nghiên cứu điển hình, theo từng bước nhỏ, từng phút quyết định — nếu
bạn đặt mình vào vị trí của chúng tôi và buộc bản thân phải suy nghĩ theo cùng con đường mà chúng tôi
nghĩ, sau đó bạn sẽ hiểu biết phong phú hơn nhiều về các nguyên tắc, mô hình, cách
tices và heuristics. Họ sẽ không còn là kiến thức "cảm thấy tốt" nữa. Họ sẽ
chạm vào ruột, ngón tay và trái tim của bạn. Họ sẽ trở thành một phần của bạn theo cách tương tự
rằng một chiếc xe đạp trở thành một phần mở rộng của ý chí của bạn khi bạn đã thành thạo cách đi nó. Sự nhìn nhận Ảnh minh họa
Cảm ơn hai nghệ sĩ của tôi, Jeniffer Kohnke và Angela Brooks. Jennifer chịu trách nhiệm
cho những bức ảnh tuyệt đẹp và sáng tạo ở đầu mỗi chương và cả những bức chân dung
của Kent Beck, Ward Cunningham, Bjarne Stroustrup, Ron Jeffries, Grady Booch, Dave
Thomas, Michael Feathers, và tôi.
Angela chịu trách nhiệm về những bức tranh khéo léo tô điểm cho các phần bên trong của mỗi chương.
Cô ấy đã thực hiện khá nhiều bức ảnh cho tôi trong nhiều năm, bao gồm nhiều bức bên trong-
các mẹo trong Thiết bị phần mềm Agile: Nguyên tắc, Mẫu và Thực hành . Cô ấy cũng là của tôi
đứa con đầu lòng mà tôi rất hài lòng. www.it-ebooks.info Trang 29
Trang này cố ý để trống www.it-ebooks.info Trang 30 xxix Trên trang bìa
Hình ảnh trên bìa là M104: The Sombrero Galaxy. M104 nằm ở Xử Nữ và là
chỉ cách chúng ta dưới 30 triệu năm ánh sáng. Tại lõi của nó là một lỗ đen siêu lớn nặng-
có khối lượng khoảng một tỷ mặt trời.
Hình ảnh có khiến bạn liên tưởng đến vụ nổ của mặt trăng quyền năng Klingon Praxis không? Tôi
nhớ rất rõ cảnh trong Star Trek VI cho thấy một vòng các mảnh vụn bay ở xích đạo
tránh xa vụ nổ đó. Kể từ cảnh đó, vòng xích đạo đã trở thành một hiện vật phổ biến
trong các vụ nổ phim khoa học viễn tưởng. Nó thậm chí còn được thêm vào sự bùng nổ của Alderaan trong các phiên bản sau này
của bộ phim Chiến tranh giữa các vì sao đầu tiên .
Điều gì đã làm cho vòng này hình thành xung quanh M104? Tại sao nó có một trung tâm lớn như vậy
phình ra và một hạt nhân nhỏ và sáng như vậy? Tôi nhìn nó như thể là lỗ đen trung tâm
mất mát và thổi bay lỗ hổng 30.000 năm ánh sáng ở giữa thiên hà. Khốn nạn cho bất kỳ
các nền văn minh có thể nằm trong con đường của sự phá vỡ vũ trụ đó.
Các lỗ đen siêu lớn nuốt chửng toàn bộ các ngôi sao trong bữa trưa, chuyển đổi một phân số khá lớn
tỷ khối của chúng thành năng lượng. E = MC 2 là đủ đòn bẩy, nhưng khi M là khối lượng sao:
Coi chưng! Có bao nhiêu ngôi sao rơi đầu vào con vẹt đó trước khi con quái vật được thỏa mãn?
Kích thước của khoảng trống trung tâm có thể là một gợi ý?
Hình ảnh M104 trên trang bìa là một
sự kết hợp của pho- ánh sáng khả kiến nổi tiếng
đồ thị từ Hubble (bên phải) và gần đây
hình ảnh hồng ngoại từ quỹ đạo Spitzer
đài quan sát (bên dưới, bên phải). Đó là tia hồng ngoại
hình ảnh cho chúng ta thấy rõ bản chất của chiếc nhẫn
của thiên hà. Trong ánh sáng khả kiến, chúng ta chỉ nhìn thấy
cạnh trước của chiếc nhẫn trong hình bóng. Các cen-
tral phình ra che lấp phần còn lại của vòng.
Nhưng trong tia hồng ngoại, các hạt nóng trong
vòng tỏa sáng qua phần phình trung tâm. Các
hai hình ảnh kết hợp cho chúng ta một cái nhìn mà chúng ta đã
chưa từng thấy trước đây và ngụ ý rằng nó đã lâu rồi
là một địa ngục hoành hành của hoạt động.
Ảnh bìa: © Kính viễn vọng Không gian Spitzer www.it-ebooks.info Trang 31
Trang này cố ý để trống www.it-ebooks.info Trang 32 1 1 Mã sạch
Bạn đang đọc cuốn sách này vì hai lý do. Đầu tiên, bạn là một lập trình viên. Thứ hai, bạn muốn
để trở thành một lập trình viên giỏi hơn. Tốt. Chúng tôi cần những lập trình viên giỏi hơn. www.it-ebooks.info Trang 33 2 Chương 1: Mã sạch
Đây là một cuốn sách về lập trình hay. Nó chứa đầy mã. Chúng tôi sẽ xem xét
mã từ mọi hướng khác nhau. Chúng tôi sẽ nhìn xuống nó từ trên xuống, nhìn lên nó từ
dưới cùng và xuyên qua nó từ trong ra ngoài. Vào lúc chúng ta hoàn thành, chúng ta sẽ biết một
rất nhiều về mã. Hơn nữa, chúng ta sẽ có thể phân biệt giữa mã tốt và mã xấu
mã. Chúng tôi sẽ biết cách viết mã tốt. Và chúng tôi sẽ biết cách chuyển đổi mã xấu thành mã tốt. Sẽ có mã
Người ta có thể tranh luận rằng một cuốn sách về mã bằng cách nào đó đi sau thời đại — mã đó không
còn vấn đề; mà chúng ta nên quan tâm đến các mô hình và yêu cầu thay thế.
Thật vậy, một số người đã gợi ý rằng chúng ta sắp kết thúc mã. Điều đó sớm tất cả mã sẽ
được tạo ra thay vì được viết. Đơn giản là không cần lập trình viên vì busi-
ness mọi người sẽ tạo ra các chương trình từ các thông số kỹ thuật.
Vô lý! Chúng tôi sẽ không bao giờ loại bỏ mã, bởi vì mã đại diện cho các chi tiết của
các yêu cầu. Ở một mức độ nào đó, những chi tiết đó không thể bị bỏ qua hoặc trừu tượng hóa; Họ phải là
được chỉ định. Và xác định các yêu cầu một cách chi tiết để máy có thể thực hiện chúng
lập trình
. Một đặc điểm kỹ thuật như vậy là mã .
Tôi hy vọng rằng mức độ trừu tượng của các ngôn ngữ của chúng ta sẽ tiếp tục tăng lên. Tôi
cũng hy vọng rằng số lượng ngôn ngữ dành riêng cho miền sẽ tiếp tục tăng. Điều này
sẽ là một điều tốt. Nhưng nó sẽ không loại bỏ mã. Thật vậy, tất cả các thông số kỹ thuật được viết
ở cấp cao hơn và ngôn ngữ dành riêng cho miền sẽ mã! Nó vẫn sẽ cần
chặt chẽ, chính xác, trang trọng và chi tiết đến mức máy móc có thể hiểu và Thực hiện nó.
Những người nghĩ rằng một ngày nào đó mã đó sẽ biến mất giống như các nhà toán học
hy vọng một ngày nào đó sẽ khám phá ra một toán học mà không cần phải chính thức. Họ đang hy vọng
rằng một ngày nào đó chúng ta sẽ khám phá ra cách tạo ra những cỗ máy có thể làm những gì chúng ta muốn thay vì
hơn những gì chúng tôi nói. Những cỗ máy này sẽ phải có thể hiểu chúng ta tốt đến mức chúng
có thể chuyển các nhu cầu được chỉ định một cách mơ hồ thành các chương trình thực thi hoàn hảo đáp ứng chính xác những nhu cầu đó.
Điều này sẽ không bao giờ xảy ra. Ngay cả con người, với tất cả trực giác và óc sáng tạo của mình,
đã có thể tạo ra các hệ thống thành công từ những cảm giác mơ hồ của khách hàng.
Thật vậy, nếu kỷ luật về đặc tả yêu cầu đã dạy chúng ta bất cứ điều gì, thì đó là
các yêu cầu được chỉ định rõ cũng chính thức như mã và có thể hoạt động như các thử nghiệm thực thi của mã!
Hãy nhớ rằng mã thực sự là ngôn ngữ mà cuối cùng chúng ta thể hiện yêu cầu-
ments. Chúng tôi có thể tạo các ngôn ngữ gần với yêu cầu hơn. Chúng tôi có thể tạo ra các công cụ
giúp chúng tôi phân tích cú pháp và tập hợp các yêu cầu đó thành các cấu trúc chính thức. Nhưng chúng tôi sẽ
không bao giờ loại bỏ độ chính xác cần thiết — vì vậy sẽ luôn có mã. www.it-ebooks.info Trang 34 3 Mã xấu Mã xấu
Gần đây tôi đã đọc lời tựa cho Kent Beck's
cuốn sách Các mô hình thực hiện. 1 Anh ấy nói, “. . . điều này
cuốn sách dựa trên một tiền đề khá mong manh: rằng
vấn đề mã tốt. . . . ” Một tiền đề mong manh ? Tôi không
đồng ý! Tôi nghĩ tiền đề đó là một trong những tiền đề
mạnh mẽ, được hỗ trợ và quá tải của tất cả các
tiếng ồn trong nghề của chúng tôi (và tôi nghĩ Kent biết điều đó). Chúng tôi
biết mã tốt quan trọng bởi vì chúng tôi đã phải
đối phó quá lâu với sự thiếu hụt của nó.
Tôi biết một công ty, vào cuối những năm 80,
đã viết một ứng dụng giết người . Nó rất phổ biến và rất nhiều
các chuyên gia đã mua và sử dụng nó. Nhưng sau đó
chu kỳ phát hành bắt đầu kéo dài. Lỗi không
sửa chữa từ bản phát hành này sang bản tiếp theo. Thời gian tải
tăng lên và sự cố tăng lên. Tôi nhớ ngày tôi
tắt sản phẩm một cách thất vọng và không bao giờ
đã sử dụng nó một lần nữa. Công ty đã ngừng kinh doanh
một thời gian ngắn sau đó.
Hai thập kỷ sau, tôi gặp một trong những nhân viên đầu tiên của công ty đó và hỏi anh ta
chuyê ̣n gì đã xảy ra. Câu trả lời khẳng định nỗi sợ hãi của tôi. Họ đã đưa sản phẩm đến
thị trường và đã tạo ra một mớ hỗn độn lớn trong mã. Khi họ ngày càng thêm nhiều tính năng,
mã ngày càng trở nên tồi tệ hơn cho đến khi họ không thể quản lý được nữa. Đó là điều tồi tệ
mã đã đưa công ty đi xuống.
Đã bạn đã bao giờ bị cản trở đáng kể theo mã xấu? Nếu bạn là một lập trình viên của
bất kỳ kinh nghiệm nào thì bạn đã cảm thấy trở ngại này nhiều lần. Thật vậy, chúng tôi có tên cho
nó. Chúng tôi gọi nó là lội . Chúng tôi lội qua mã xấu. Chúng tôi khẩu hiệu qua một mớ hỗn độn
brambles và cạm bẫy tiềm ẩn. Chúng tôi đấu tranh để tìm ra con đường của mình, hy vọng một số gợi ý, một số
manh mối, về những gì đang xảy ra; nhưng tất cả những gì chúng ta thấy ngày càng nhiều mã vô tri.
Tất nhiên bạn đã bị cản trở bởi mã xấu. Vậy thì - tại sao bạn lại viết nó?
Bạn có cố gắng đi nhanh không? Bạn có đang vội không? Có lẽ vậy. Có lẽ bạn cảm thấy rằng bạn
không có thời gian để làm tốt công việc; rằng sếp của bạn sẽ tức giận với bạn nếu bạn lấy
thời gian để xóa mã của bạn. Có lẽ bạn chỉ cảm thấy mệt mỏi khi làm việc với chương trình này và
muốn nó kết thúc. Hoặc có thể bạn đã xem xét tồn đọng của những thứ khác mà bạn đã quảng cáo-
phải hoàn thành và nhận ra rằng bạn cần kết hợp mô-đun này lại với nhau để có thể
chuyển sang phần tiếp theo. Tất cả chúng ta đã làm được.
Tất cả chúng tôi đã xem xét mớ hỗn độn mà chúng tôi vừa tạo ra và sau đó đã chọn để nó
Một ngày khác. Tất cả chúng tôi đều cảm thấy nhẹ nhõm khi thấy chương trình lộn xộn của mình hoạt động và quyết định rằng 1. [Beck07]. www.it-ebooks.info Trang 35 4 Chương 1: Mã sạch
làm việc lộn xộn còn hơn không. Tất cả chúng tôi đã nói rằng chúng tôi sẽ quay lại và dọn dẹp nó sau. Của
Tất nhiên, những ngày đó chúng ta chưa biết đến định luật của LeBlanc: Sau này không bao giờ bằng .
Tổng chi phí sở hữu một tin nhắn
Nếu bạn đã là một lập trình viên hơn hai hoặc ba năm, bạn có thể đã
bị chậm lại đáng kể bởi mã lộn xộn của người khác. Nếu bạn đã là một lập trình viên
trong hơn hai hoặc ba năm, bạn có thể đã bị chậm lại bởi mã lộn xộn.