際際滷

際際滷Share a Scribd company logo
SEMINAR: CLEAN CODE
PRESENTERS:
NGUYEN VAN THIEU
TRAN THE ANH
1. TH畉 NO L CLEAN CODE
 L lm t畛t 1 vi畛c
 L 董n gi畉n v tr畛c ti畉p, gi畛ng nh動 畛c vn xu担i 動畛c vi畉t t畛t, kh担ng lm lu m畛 箪 畛nh c畛a thi畉t k畉 nh動ng
v畉n 畉y 畛 c叩c kh叩i ni畛m tr畛u t動畛ng s畉c n辿t v 動畛ng ki畛m so叩t 董n gi畉n.
 L m達 s畉ch c坦 th畛 畛c, nh畉n bi畉t v c坦 箪 ngh挑a.
 L code s畉 c坦 th畛 動畛c 畛c, v 動畛c ci thi畛n ho畉c vi畉t ti畉p 動畛c b畛i developer kh叩c. N坦 c坦 董n v畛 ch畉p
nh畉n v ki畛m tra. N坦 c坦 t棚n 畉y 箪 ngh挑a. N坦 cung c畉p m畛t c叩ch kh叩 h董n nhi畛u c叩ch 畛 lm m畛t i畛u. N坦 c坦
ph畛 thu畛c t畛i thi畛u, 動畛c 畛nh ngh挑a m畛t c叩ch r探 rng, v cung c畉p m畛t API r探 rng v t畛i thi畛u.
 Lu担n lu担n gi畛ng nh畛ng g狸 m 動畛c vi畉t b畛i 1 ng動畛i quan t但m n坦 th畉t s畛
 Gi畉m s畛 l畉p l畉i, bi畛u c畉m cao, v x但y d畛ng ban 畉u c畛a s畛 tr畛u t動畛ng 董n gi畉n.
 L m達 ch畉y t畉t c畉 c叩c bi test 畛 ki畛m tra, m達 kh担ng ch畛a tr湛ng l畉p m v畉n by t畛 畉y 畛 nh畛ng 箪 t動畛ng
thi畉t k畉 trong h畛 th畛ng.
 L m達 gi畉m thi畉u s畛 l動畛ng c叩c classes, functions, methods.
2. LM TH畉 NO 畛 CODE "TRONG SNG"
 Khi lm d畛 叩n hay l畉p tr狸nh b畉t k畛 th畛 g狸 ta ph畉i c坦 c叩c quy t畉c
code (code convention)
 畛 code trong s叩ng th狸 ta ph畉i c坦 quy t畉c code chu畉n, r探 rng,
v lm theo 動畛c c叩c chu畉n 坦 坦.
3. NH畛NG NGUYN T畉C C B畉N (CODE
CONVERSION)
 Quy t畉c 畉t t棚n
 Quy t畉c v畛i Hm (Functions)
 Quy t畉c v畛i Comments
 畛nh d畉ng code (Formatting)
 Quy t畉c v畛i Objects v Data Structures
 Quy t畉c x畛 l箪 l畛i
3.1. Quy t畉c 畉t t棚n
1. S畛 d畛ng t棚n c坦 箪 ngh挑a
2. Tr叩nh d湛ng c叩c ch畛 c叩i g但y hi畛u l畉m, ho畉c 畉t t棚n qu叩 ng畉n g但y hi畛u l畉m
3. Lm cho s畛 ph但n bi畛t c坦 箪 ngh挑a.
4. S畛 d畛ng t棚n ph叩t 但m 動畛c 畛 c坦 th畛 d畛 nh畛, d畛 h狸nh dung.
5. 畉t t棚n d畛 t狸m ki畉m trong ph畉n m畛m.
6. T棚n classes v object th狸 n棚n 畛 l danh t畛 v ph畉i r探 ngh挑a, kh担ng n棚n l 畛ng t畛.
7. T棚n hm d湛ng prefixed 畛 r探 ngh挑a v畛i set, get, is..
3.1. Quy t畉c 畉t t棚n
1. S畛 d畛ng t棚n c坦 箪 ngh挑a (T棚n th畛 hi畛n r探 動畛c m畛c 鱈ch c畛a bi畉n, hm...)
Vd:
int d // Kh担ng c坦 箪 ngh挑a g狸
int dayOfThisMonth // Hi畛u 動畛c l s畛 ngy trong th叩ng
2. Tr叩nh d湛ng c叩c ch畛 c叩i g但y hi畛u l畉m, ho畉c 畉t t棚n qu叩 ng畉n g但y hi畛u l畉m
Vd:
int o // 但y l bi畉n o
if (o == 1)
a = o
else
b = o // Nh狸n n坦 gi畛ng s畛 0 n棚n d畛 g但y hi畛u l畉m
3.1. Quy t畉c 畉t t棚n
3. Lm cho s畛 ph但n bi畛t c坦 箪 ngh挑a.
Vd:
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
public static void copyChars(char source[], char destination[]) {
for (int i = 0; i < source.length; i++) {
destination[i] = source[i];
}
}
3.1. Quy t畉c 畉t t棚n
4. S畛 d畛ng t棚n ph叩t 但m 動畛c 畛 c坦 th畛 d畛 nh畛, d畛 h狸nh dung.
Vd: class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
};
class Customer {
private Date generationTimestamp;
private Date modificationTimestamp;;
private final String recordId = "102";
};
3.1. Quy t畉c 畉t t棚n
5. 畉t t棚n d畛 t狸m ki畉m trong ph畉n m畛m.
Vd:
3.1. Quy t畉c 畉t t棚n
6. T棚n classes v object th狸 n棚n 畛 l danh t畛 v ph畉i r探 ngh挑a, kh担ng n棚n l 畛ng t畛.
Vd:
Manager, Processor, Data. (Kh担ng n棚n d湛ng)
Customer, WikiPage,Account, and AddressParser. (N棚n d湛ng)
8. T棚n hm
Vd:
postPayment, deletePage, save.  T棚n hm th動畛ng vi畉t d畉ng cammelCase hoc cammel_case
- D湛ng prefixed 畛 r探 ngh挑a v畛i set, get, is..
Vd:
string name = employee.getName();
customer.setName("thieunv");
if(paycheck.isPosted()) {
...
}
3.2. QUY T畉C V畛I HM
1. Nh畛 g畛n
2. Blocks v Indenting
3. Lm 1 vi畛c .
4. M畛t c畉p 畛 tr畛u t動畛ng tr棚n 1 hm.
5. Reading code from Top to Bottom : The Stepdown Rule
6. Switch Statements
7. S畛 d畛ng tham s畛 c畛a hm
8. Command Query Separation
9. Prefer Exceptions to Returning Error Codes
10. Tr鱈ch xu畉t try/catch block.
11. Error Handling Is One Thing
12. How Do You Write Functions Like This?
3.2. QUY T畉C V畛I HM
1. Nh畛 g畛n
 1 d嘆ng kh担ng n棚n qu叩 150 k箪 t畛
 1 hm kh担ng n棚n qu叩 30 d嘆ng (1 trang gi畉y)
2. Blocks v Indenting
 V畛i c叩c block if,else kh担ng n棚n n畛i ti畉p l畉p qu叩 s但u (qu叩 3 m畛c)
 L湛i 畉u d嘆ng chu畉n, n棚n d湛ng tab.
3. Lm 1 vi畛c
 FUNCTIONS SHOULD DO ONE THING. THEY SHOULD DO IT WELL. THEY SHOULD DO
IT ONLY.
4. M畛t c畉p 畛 tr畛u t動畛ng tr棚n 1 hm.
5. Reading code from Top to Bottom : The Stepdown Rule
3.2. QUY T畉C V畛I HM
6. Switch Statements
==> 1. Qu叩 l畛n, khi th棚m lo畉i c畛a employee n坦 s畉 l畛n h董n n畛a.
2. N坦 lm nhi畛u h董n 1 vi畛c.
3. X但m ph畉m nguy棚n t畉c Single Responsibility Principle (SRP)
4. X但m ph畉m nguy棚n t畉c Open Closed Principle (OCP)
3.2. QUY T畉C V畛I HM
3.2. QUY T畉C V畛I HM
7. S畛 d畛ng tham s畛 c畛a hm
- Nhi畛u nh畉t n棚n l 2 tham s畛 畉u vo
- N畉u c坦 nhi畛u tham s畛 h董n 2 th狸 n棚n bao ch炭ng l畉i trong 1 class
Vd:
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);
- 畛i v畛i tham s畛 畉u ra c畉n r探 rng, gi畉i th鱈ch nh動 tham s畛 畉u vo.
3.2. QUY T畉C V畛I HM
8. Command Query Separation
- Hm n棚n lm vi畛c g狸 坦 ho畉c tr畉 l畛i gi 坦 nh動ng kh担ng n棚n lm c畉 2.
Vd ph畛 bi畉n:
public boolean set(String attribute, String value);
==> Hm ny set gi叩 tr畛 c畛a attribute l value. N畉u thnh c担ng th狸 tr畉 v畛 true.
==> N坦 s畉 d畉n 畉n c但u l畛nh sau:
if (set("username", "unclebob"))...
==> N畉u ta l reader. Ta s畉 t畛 h畛i. c叩i hm set ny n坦 lm nhi畛m v畛 g狸? 達 l set t畉i sao l畉i cho 動畛c trong if.
==> 畛 fix 動畛c ta c坦 th畛 畛i t棚n l: setAndCheckIfExists ==> C滴ng kh担ng m畉y kh畉 quan.
==> 畛 th畉t s畛 fix 動畛c ta n棚n chia r畉 nhi畛m v畛 c畛a ch炭ng ra nh動 sau:
if (attributeExists("username")) {
setAttribute("username", "unclebob");
...
}
3.2. QUY T畉C V畛I HM
9. Prefer Exceptions to Returning Error Codes
- Tr畉 v畛 l畛i code t畛 hm l vi ph畉m s畛 tinh t畉 c畛a g畛i l畛nh t叩ch bi畛t.
if (deletePage(page) == E_OK)
- i畛u ny kh担ng g但y nh畉m l畉n hay d畉n 畉n x畛 l箪 c畉u tr炭c l畉p. Nh動ng khi tr畉 v畛 l畛i code, ta ph畉i gi畉i quy畉t
ngay n坦.
3.2. QUY T畉C V畛I HM
- Thay v狸 ph畉i d湛ng nhi畛u if nh動 tr棚n ta c坦 th畛 d湛ng Exceptions 畛 x畛 l箪.
3.2. QUY T畉C V畛I HM
- M畛t l畛i th畉 kh叩c c畛a Exceptions n畛a l:
public enum Error {
OK,
INVALID,
NO_SUCH,
LOCKED,
OUT_OF_RESOURCES,
WAITING_FOR_EVENT;
}
==> Khi ta c坦 c叩c l畛i code nh動 tr棚n. S畉 r畉t nhi畛u n董i ph畉i import enum vo. N畉u gi畛 Error c坦 th棚m l畛i. Ta
ph畉i thay 畛i enum.
==> S畉 d畉n 畉n vi畛c c叩c n董i kh叩c d湛ng Error s畉 ph畉i thay 畛i ==> Ta ph畉i recompile and rebuild l畉i.
==> Gi畛 n畉u ta d湛ng Exceptions
3.2. QUY T畉C V畛I HM
10. Tr鱈ch xu畉t try/catch block.
- B畉n th但n try/catch 達 l r畉t t畛i. N坦 b畛 tr畛n l畉n gi畛a l畛i v x畛 l箪 t畛 nhi棚n.
- 畛 gi炭p d畛 畛c, d畛 hi畛u v khi畉n code trong s叩ng h董n th狸 ta n棚n t叩ch bi畛t th但n ra hm.
Vd:
- Hm delete b棚n tr棚n ch畛 v畛 x畛 l箪 l畛i. Hm deletePageAndAllReferences ch畛 v畛 x畛 l箪 vi畛c x坦a page. x畛 l箪 l畛i kh担ng tr畛n l畉n.
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
}
catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws
Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e) {
logger.log(e.getMessage());
}
3.2. QUY T畉C V畛I HM
11. Error Handling Is One Thing
- Hm lm 1 vi畛c. X畛 l箪 l畛i lm 1 vi畛c. V畉y hm x畛 l箪 l畛i kh担ng n棚n lm vi畛c g狸 kh叩c.
- Gi畛ng vd b棚n tr棚n. Trong hm delete ch畛 c坦 duy nh畉t kh畛i try/catch.
3.2. QUY T畉C V畛I HM
12. How Do You Write Functions Like This?
- Vi畉t hm gi畛ng nh動 vi畉t paper, article hay b畉t c畛 th畛 g狸 v畛 vi畉t.
- 畉u ti棚n ta n棚n c坦 b畉n nh叩p, sau 坦 t畛 ch畛c l畉i, 畉t t棚n l畉i, chia nh畛 n坦 ra, gi畉m s畛 tr湛ng
lp...
- C坦 th畛 l炭c 畉u ta c畉m th畉y lm v畉y m畉t th畛i gian, nh動ng khi v畛 sau ph畉i debug ho畉c
maintain th狸 ta m畛i th畉y 動畛c s畛
l畛i h畉i th畉t s畛 c畛a vi畛c vi畉t n坦 clean.
- Kh担ng nh畛ng v畉y n坦 c嘆n lm ta tr畛 thnh better programmer.
3.3. QUY T畉C V畛I COMMENTS
1. Comment gi畉i th鱈ch 炭ng r探 m畛c 鱈ch c畛a n坦.
2. Comment t畛t v h畛p l箪
3. Bad Comments
4. Redundant Comments
5. Noise Comments, Comments sai l棚ch
6. Commented-Out Code
3.3. QUY T畉C V畛I COMMENTS
1. Comment gi畉i th鱈ch 炭ng r探 m畛c 鱈ch c畛a n坦.
- Comment kh担ng trang i畛m cho bad code nh動ng n坦 n坦i l棚n r畉ng code c畛a b畉n kh担ng
clean.
- Tr動畛c khi comment, ta h達y ngh挑 t畉i sao ta l畉i ph畉i c畉n comment.
- N畉u ta th畉y o畉n code l畉ng nh畉ng, kh坦 hi畛u ph畉i c畉n comment. Th狸 ta n棚n ginh th畛i
gian 畛 clean o畉n code 坦 thay v狸 ng畛i comment n坦.
- Vd:
// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
if (employee.isEligibleForFullBenefits())
- Thay v狸 ph畉i vi畉t comment v 1 畛ng logic nh動 tr棚n. Ta ch畛 c畉n t畛ng ch炭ng vo hm v
畉t t棚n d畛 hi畛u th狸 code clean h董n.
3.3. QUY T畉C V畛I COMMENTS
2. Comment t畛t v h畛p l箪
Vd:
// Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the GNU General Public License version 2 or later.
- Khi publish d畛 叩n th狸 ta n棚n vi畉t comment th畉 no vo source 畛 n坦i quy畛n s畛 h畛u,
version...
3.3. QUY T畉C V畛I COMMENTS
3. Bad Comments
- a ph畉n ch炭ng ta r董i vo 但y.
- C坦 nhi畛u l炭c ta kh担ng c畉n comment, nh動ng ta l畉i c畉m th畉y c畉n comment. v畉y l ta ginh th畛i gian 畛 vi畉t comment.
Vd:
==> Ta c坦 th畛 th畉y o畉n comment tr棚n c坦 th畛 c坦 箪 ngh挑a no 坦 v畛i ng動畛i vi畉t, nh動ng ch畉c ch畉n s畉 v担 ngh挑a v畛i reader.
- Ta c坦 th畛 hi畛u n畉u r董i vo catch th狸 s畉 kh担ng c坦 file no 動畛c load.
- Nh動ng n畉u file 動畛c load th狸 s畉 load 畛 但u, load l炭c no (t叩c gi畉 ch動a n坦i b棚n tr棚n)
3.3. QUY T畉C V畛I COMMENTS
4. Redundant Comments
Vd:
- Ta th畉y comment tr棚n kia l s畛 l畉p l畉i th担ng tin c畛a hm, kh担ng nh畛ng th畉 n坦 c嘆n cho ta
bi畉t
it th担ng tin h董n c畛a hm. N畉u 畛c l畉n 畉u vo comment b畉n s畉 kh担ng hi畛u g狸.
3.3. QUY T畉C V畛I COMMENTS
5. Noise Comments, Comments sai l棚ch
- Nhi畛u khi comments th畉t s畛 l noise. N坦 kh担ng th畉t s畛 cung c畉p cho ta th担ng tin m畛i g狸 c畉.
Vd:
/**
* @param title The title of the CD
* @param author The author of the CD
* @param tracks The number of tracks on the CD
* @param durationInMinutes The duration of the CD in minutes
*/
public void addCD(String title, String author, int tracks, int durationInMinutes) {
CD cd = new CD();
cd.title = title;
cd.author = author;
cd.tracks = tracks;
cd.duration = duration;
cdList.add(cd);
}
/**
* Default constructor.
*/
protected AnnualDateRule() {}
/** The day of the month. */
private int dayOfMonth;
/**
* Returns the day of the month.
*
* @return the day of the month.
*/
public int getDayOfMonth() {
return dayOfMonth;
}
3.3. QUY T畉C V畛I COMMENTS
6. Commented-Out Code
- Kh担ng bao gi畛 n棚n lm i畛u ny.
- Ng動畛i sau 畛c s畉 th畉y kh坦 hi畛u, v kh担ng d叩m x坦a v狸 ng畛 n坦 quan tr畛ng.
- N坦 c嘆n g但y ra hi畛u l畉m. Do 坦 t畛t nh畉t n棚n x坦a i lu担n.
InputStreamResponse response = new InputStreamResponse();
response.setBody(formatter.getResultStream(), formatter.getByteCount());
// InputStream resultsStream = formatter.getResultStream();
// StreamReader reader = new StreamReader(resultsStream);
// response.setContent(reader.read(formatter.getByteCount()));
3.4. 畛NH D畉NG CODE (FORMATTING)
1. Vertical Formatting
2. Variable Declarations
 Instance variables
 Dependent Functions.
 Horizontal Formatting
 Indentation
 Breaking Indentation
 Team Rules
3.4. 畛NH D畉NG CODE (FORMATTING)
1. Vertical Formatting
- S畛 d嘆ng trong 1 file t湛y theo c叩c l畉p tr狸nh vi棚n vi畉t code c畛a h畛 th畉 no.
- Nh動ng m畛t file n棚n c坦 鱈t nh畉t 10 d嘆ng v t畛i a l 500 d嘆ng, th動畛ng trung b狸nh l 150-300.
- Nh動 v畉y code s畉 kh担ng qu叩 l畛n 畛 畛c hi畛u 1 file.
2. Variable Declarations
- Ta n棚n khai b叩o bi畉n g畉n n董i m n坦 s畛 d畛ng nh畉t c坦 th畛. B畛i v狸 hm r畉t ng畉n, bi畉n local n棚n xu畉t hi畛n 畛 畉u
c畛a hm.
- Bi畉n i畛u khi畛n th狸 n棚n khai b叩o lu担n trong v嘆ng l畉p.
Vd:
3.4. 畛NH D畉NG CODE (FORMATTING)
3. Instance variables
- Bi畉n th畛 hi畛n th狸 n棚n khai b叩o 畛 ngay 畉u c畛a class. i畛u quan tr畛ng 畛 但y l c叩c bi畉n
instance th狸 n棚n khai b叩o c湛ng 1 n董i, 畛 reader c坦 th畛 th畛 bi畉t m 畛c.
3.4. 畛NH D畉NG CODE (FORMATTING)
4. Dependent Functions.
- N畉u c坦 1 hm g畛i hm kh叩c. Th狸 n棚n 畉t hm g畛i tr棚n 畉u.
- Nh動 v畉y reader c坦 th畛 畛c hi畛u theo 1 c叩ch t畛 nhi棚n theo top-down.
5. Horizontal Formatting
- L畛i khuy棚n l n棚n 畛 120 k箪 t畛 l max tr棚n 1 d嘆ng.
- N棚n 畛 箪 畉n kho畉ng tr畉ng gi畛a c叩c k箪 t畛.
3.4. 畛NH D畉NG CODE (FORMATTING)
6. Breaking Indentation
- 担i l炭c ta g畉p vi tr動畛ng h畛p m ta c坦 th畛 ph叩 v畛 動畛c vi畛c l湛i 畉u d嘆ng.
Vd:
--> M畉c d湛 vi畛c lm ny r炭t g畛n 動畛c s畛 d嘆ng code, nh動ng n坦 l畉i lm cho ta kh坦 nh狸n h董n, t畛t
nh畉t n棚n 畛 d畉ng chu畉n nh動 b棚n d動畛i.
3.4. 畛NH D畉NG CODE (FORMATTING)
7. Team Rules
- M畛i programmer 畛u c坦 formatting rule ri棚ng. Nh動ng n畉u anh ta tham gia vo 1 team th狸
team 坦 ph畉i c坦 rule r探 rng v chi ti畉t.
- C畉 nh坦m c畉n th畛ng nh畉t 1 rule. Kh担ng n棚n t畛n t畉i 箪 ki畉n c叩 nh但n r畉ng c坦 ng動畛i kh担ng
th鱈ch theo rule ny.
- H達y nh畛, h畛 th畛ng ph畉n m畛m t畛t l t畉p h畛p c叩c ti li畛u 畛c t畛t. Ng動畛i 畛c ch畉p 動畛c
style c畛a team 坦.

More Related Content

Seminar clean code

  • 1. SEMINAR: CLEAN CODE PRESENTERS: NGUYEN VAN THIEU TRAN THE ANH
  • 2. 1. TH畉 NO L CLEAN CODE L lm t畛t 1 vi畛c L 董n gi畉n v tr畛c ti畉p, gi畛ng nh動 畛c vn xu担i 動畛c vi畉t t畛t, kh担ng lm lu m畛 箪 畛nh c畛a thi畉t k畉 nh動ng v畉n 畉y 畛 c叩c kh叩i ni畛m tr畛u t動畛ng s畉c n辿t v 動畛ng ki畛m so叩t 董n gi畉n. L m達 s畉ch c坦 th畛 畛c, nh畉n bi畉t v c坦 箪 ngh挑a. L code s畉 c坦 th畛 動畛c 畛c, v 動畛c ci thi畛n ho畉c vi畉t ti畉p 動畛c b畛i developer kh叩c. N坦 c坦 董n v畛 ch畉p nh畉n v ki畛m tra. N坦 c坦 t棚n 畉y 箪 ngh挑a. N坦 cung c畉p m畛t c叩ch kh叩 h董n nhi畛u c叩ch 畛 lm m畛t i畛u. N坦 c坦 ph畛 thu畛c t畛i thi畛u, 動畛c 畛nh ngh挑a m畛t c叩ch r探 rng, v cung c畉p m畛t API r探 rng v t畛i thi畛u. Lu担n lu担n gi畛ng nh畛ng g狸 m 動畛c vi畉t b畛i 1 ng動畛i quan t但m n坦 th畉t s畛 Gi畉m s畛 l畉p l畉i, bi畛u c畉m cao, v x但y d畛ng ban 畉u c畛a s畛 tr畛u t動畛ng 董n gi畉n. L m達 ch畉y t畉t c畉 c叩c bi test 畛 ki畛m tra, m達 kh担ng ch畛a tr湛ng l畉p m v畉n by t畛 畉y 畛 nh畛ng 箪 t動畛ng thi畉t k畉 trong h畛 th畛ng. L m達 gi畉m thi畉u s畛 l動畛ng c叩c classes, functions, methods.
  • 3. 2. LM TH畉 NO 畛 CODE "TRONG SNG" Khi lm d畛 叩n hay l畉p tr狸nh b畉t k畛 th畛 g狸 ta ph畉i c坦 c叩c quy t畉c code (code convention) 畛 code trong s叩ng th狸 ta ph畉i c坦 quy t畉c code chu畉n, r探 rng, v lm theo 動畛c c叩c chu畉n 坦 坦.
  • 4. 3. NH畛NG NGUYN T畉C C B畉N (CODE CONVERSION) Quy t畉c 畉t t棚n Quy t畉c v畛i Hm (Functions) Quy t畉c v畛i Comments 畛nh d畉ng code (Formatting) Quy t畉c v畛i Objects v Data Structures Quy t畉c x畛 l箪 l畛i
  • 5. 3.1. Quy t畉c 畉t t棚n 1. S畛 d畛ng t棚n c坦 箪 ngh挑a 2. Tr叩nh d湛ng c叩c ch畛 c叩i g但y hi畛u l畉m, ho畉c 畉t t棚n qu叩 ng畉n g但y hi畛u l畉m 3. Lm cho s畛 ph但n bi畛t c坦 箪 ngh挑a. 4. S畛 d畛ng t棚n ph叩t 但m 動畛c 畛 c坦 th畛 d畛 nh畛, d畛 h狸nh dung. 5. 畉t t棚n d畛 t狸m ki畉m trong ph畉n m畛m. 6. T棚n classes v object th狸 n棚n 畛 l danh t畛 v ph畉i r探 ngh挑a, kh担ng n棚n l 畛ng t畛. 7. T棚n hm d湛ng prefixed 畛 r探 ngh挑a v畛i set, get, is..
  • 6. 3.1. Quy t畉c 畉t t棚n 1. S畛 d畛ng t棚n c坦 箪 ngh挑a (T棚n th畛 hi畛n r探 動畛c m畛c 鱈ch c畛a bi畉n, hm...) Vd: int d // Kh担ng c坦 箪 ngh挑a g狸 int dayOfThisMonth // Hi畛u 動畛c l s畛 ngy trong th叩ng 2. Tr叩nh d湛ng c叩c ch畛 c叩i g但y hi畛u l畉m, ho畉c 畉t t棚n qu叩 ng畉n g但y hi畛u l畉m Vd: int o // 但y l bi畉n o if (o == 1) a = o else b = o // Nh狸n n坦 gi畛ng s畛 0 n棚n d畛 g但y hi畛u l畉m
  • 7. 3.1. Quy t畉c 畉t t棚n 3. Lm cho s畛 ph但n bi畛t c坦 箪 ngh挑a. Vd: public static void copyChars(char a1[], char a2[]) { for (int i = 0; i < a1.length; i++) { a2[i] = a1[i]; } } public static void copyChars(char source[], char destination[]) { for (int i = 0; i < source.length; i++) { destination[i] = source[i]; } }
  • 8. 3.1. Quy t畉c 畉t t棚n 4. S畛 d畛ng t棚n ph叩t 但m 動畛c 畛 c坦 th畛 d畛 nh畛, d畛 h狸nh dung. Vd: class DtaRcrd102 { private Date genymdhms; private Date modymdhms; private final String pszqint = "102"; }; class Customer { private Date generationTimestamp; private Date modificationTimestamp;; private final String recordId = "102"; };
  • 9. 3.1. Quy t畉c 畉t t棚n 5. 畉t t棚n d畛 t狸m ki畉m trong ph畉n m畛m. Vd:
  • 10. 3.1. Quy t畉c 畉t t棚n 6. T棚n classes v object th狸 n棚n 畛 l danh t畛 v ph畉i r探 ngh挑a, kh担ng n棚n l 畛ng t畛. Vd: Manager, Processor, Data. (Kh担ng n棚n d湛ng) Customer, WikiPage,Account, and AddressParser. (N棚n d湛ng) 8. T棚n hm Vd: postPayment, deletePage, save. T棚n hm th動畛ng vi畉t d畉ng cammelCase hoc cammel_case - D湛ng prefixed 畛 r探 ngh挑a v畛i set, get, is.. Vd: string name = employee.getName(); customer.setName("thieunv"); if(paycheck.isPosted()) { ... }
  • 11. 3.2. QUY T畉C V畛I HM 1. Nh畛 g畛n 2. Blocks v Indenting 3. Lm 1 vi畛c . 4. M畛t c畉p 畛 tr畛u t動畛ng tr棚n 1 hm. 5. Reading code from Top to Bottom : The Stepdown Rule 6. Switch Statements 7. S畛 d畛ng tham s畛 c畛a hm 8. Command Query Separation 9. Prefer Exceptions to Returning Error Codes 10. Tr鱈ch xu畉t try/catch block. 11. Error Handling Is One Thing 12. How Do You Write Functions Like This?
  • 12. 3.2. QUY T畉C V畛I HM 1. Nh畛 g畛n 1 d嘆ng kh担ng n棚n qu叩 150 k箪 t畛 1 hm kh担ng n棚n qu叩 30 d嘆ng (1 trang gi畉y) 2. Blocks v Indenting V畛i c叩c block if,else kh担ng n棚n n畛i ti畉p l畉p qu叩 s但u (qu叩 3 m畛c) L湛i 畉u d嘆ng chu畉n, n棚n d湛ng tab. 3. Lm 1 vi畛c FUNCTIONS SHOULD DO ONE THING. THEY SHOULD DO IT WELL. THEY SHOULD DO IT ONLY. 4. M畛t c畉p 畛 tr畛u t動畛ng tr棚n 1 hm. 5. Reading code from Top to Bottom : The Stepdown Rule
  • 13. 3.2. QUY T畉C V畛I HM 6. Switch Statements ==> 1. Qu叩 l畛n, khi th棚m lo畉i c畛a employee n坦 s畉 l畛n h董n n畛a. 2. N坦 lm nhi畛u h董n 1 vi畛c. 3. X但m ph畉m nguy棚n t畉c Single Responsibility Principle (SRP) 4. X但m ph畉m nguy棚n t畉c Open Closed Principle (OCP)
  • 14. 3.2. QUY T畉C V畛I HM
  • 15. 3.2. QUY T畉C V畛I HM 7. S畛 d畛ng tham s畛 c畛a hm - Nhi畛u nh畉t n棚n l 2 tham s畛 畉u vo - N畉u c坦 nhi畛u tham s畛 h董n 2 th狸 n棚n bao ch炭ng l畉i trong 1 class Vd: Circle makeCircle(double x, double y, double radius); Circle makeCircle(Point center, double radius); - 畛i v畛i tham s畛 畉u ra c畉n r探 rng, gi畉i th鱈ch nh動 tham s畛 畉u vo.
  • 16. 3.2. QUY T畉C V畛I HM 8. Command Query Separation - Hm n棚n lm vi畛c g狸 坦 ho畉c tr畉 l畛i gi 坦 nh動ng kh担ng n棚n lm c畉 2. Vd ph畛 bi畉n: public boolean set(String attribute, String value); ==> Hm ny set gi叩 tr畛 c畛a attribute l value. N畉u thnh c担ng th狸 tr畉 v畛 true. ==> N坦 s畉 d畉n 畉n c但u l畛nh sau: if (set("username", "unclebob"))... ==> N畉u ta l reader. Ta s畉 t畛 h畛i. c叩i hm set ny n坦 lm nhi畛m v畛 g狸? 達 l set t畉i sao l畉i cho 動畛c trong if. ==> 畛 fix 動畛c ta c坦 th畛 畛i t棚n l: setAndCheckIfExists ==> C滴ng kh担ng m畉y kh畉 quan. ==> 畛 th畉t s畛 fix 動畛c ta n棚n chia r畉 nhi畛m v畛 c畛a ch炭ng ra nh動 sau: if (attributeExists("username")) { setAttribute("username", "unclebob"); ... }
  • 17. 3.2. QUY T畉C V畛I HM 9. Prefer Exceptions to Returning Error Codes - Tr畉 v畛 l畛i code t畛 hm l vi ph畉m s畛 tinh t畉 c畛a g畛i l畛nh t叩ch bi畛t. if (deletePage(page) == E_OK) - i畛u ny kh担ng g但y nh畉m l畉n hay d畉n 畉n x畛 l箪 c畉u tr炭c l畉p. Nh動ng khi tr畉 v畛 l畛i code, ta ph畉i gi畉i quy畉t ngay n坦.
  • 18. 3.2. QUY T畉C V畛I HM - Thay v狸 ph畉i d湛ng nhi畛u if nh動 tr棚n ta c坦 th畛 d湛ng Exceptions 畛 x畛 l箪.
  • 19. 3.2. QUY T畉C V畛I HM - M畛t l畛i th畉 kh叩c c畛a Exceptions n畛a l: public enum Error { OK, INVALID, NO_SUCH, LOCKED, OUT_OF_RESOURCES, WAITING_FOR_EVENT; } ==> Khi ta c坦 c叩c l畛i code nh動 tr棚n. S畉 r畉t nhi畛u n董i ph畉i import enum vo. N畉u gi畛 Error c坦 th棚m l畛i. Ta ph畉i thay 畛i enum. ==> S畉 d畉n 畉n vi畛c c叩c n董i kh叩c d湛ng Error s畉 ph畉i thay 畛i ==> Ta ph畉i recompile and rebuild l畉i. ==> Gi畛 n畉u ta d湛ng Exceptions
  • 20. 3.2. QUY T畉C V畛I HM 10. Tr鱈ch xu畉t try/catch block. - B畉n th但n try/catch 達 l r畉t t畛i. N坦 b畛 tr畛n l畉n gi畛a l畛i v x畛 l箪 t畛 nhi棚n. - 畛 gi炭p d畛 畛c, d畛 hi畛u v khi畉n code trong s叩ng h董n th狸 ta n棚n t叩ch bi畛t th但n ra hm. Vd: - Hm delete b棚n tr棚n ch畛 v畛 x畛 l箪 l畛i. Hm deletePageAndAllReferences ch畛 v畛 x畛 l箪 vi畛c x坦a page. x畛 l箪 l畛i kh担ng tr畛n l畉n. public void delete(Page page) { try { deletePageAndAllReferences(page); } catch (Exception e) { logError(e); } } private void deletePageAndAllReferences(Page page) throws Exception { deletePage(page); registry.deleteReference(page.name); configKeys.deleteKey(page.name.makeKey()); } private void logError(Exception e) { logger.log(e.getMessage()); }
  • 21. 3.2. QUY T畉C V畛I HM 11. Error Handling Is One Thing - Hm lm 1 vi畛c. X畛 l箪 l畛i lm 1 vi畛c. V畉y hm x畛 l箪 l畛i kh担ng n棚n lm vi畛c g狸 kh叩c. - Gi畛ng vd b棚n tr棚n. Trong hm delete ch畛 c坦 duy nh畉t kh畛i try/catch.
  • 22. 3.2. QUY T畉C V畛I HM 12. How Do You Write Functions Like This? - Vi畉t hm gi畛ng nh動 vi畉t paper, article hay b畉t c畛 th畛 g狸 v畛 vi畉t. - 畉u ti棚n ta n棚n c坦 b畉n nh叩p, sau 坦 t畛 ch畛c l畉i, 畉t t棚n l畉i, chia nh畛 n坦 ra, gi畉m s畛 tr湛ng lp... - C坦 th畛 l炭c 畉u ta c畉m th畉y lm v畉y m畉t th畛i gian, nh動ng khi v畛 sau ph畉i debug ho畉c maintain th狸 ta m畛i th畉y 動畛c s畛 l畛i h畉i th畉t s畛 c畛a vi畛c vi畉t n坦 clean. - Kh担ng nh畛ng v畉y n坦 c嘆n lm ta tr畛 thnh better programmer.
  • 23. 3.3. QUY T畉C V畛I COMMENTS 1. Comment gi畉i th鱈ch 炭ng r探 m畛c 鱈ch c畛a n坦. 2. Comment t畛t v h畛p l箪 3. Bad Comments 4. Redundant Comments 5. Noise Comments, Comments sai l棚ch 6. Commented-Out Code
  • 24. 3.3. QUY T畉C V畛I COMMENTS 1. Comment gi畉i th鱈ch 炭ng r探 m畛c 鱈ch c畛a n坦. - Comment kh担ng trang i畛m cho bad code nh動ng n坦 n坦i l棚n r畉ng code c畛a b畉n kh担ng clean. - Tr動畛c khi comment, ta h達y ngh挑 t畉i sao ta l畉i ph畉i c畉n comment. - N畉u ta th畉y o畉n code l畉ng nh畉ng, kh坦 hi畛u ph畉i c畉n comment. Th狸 ta n棚n ginh th畛i gian 畛 clean o畉n code 坦 thay v狸 ng畛i comment n坦. - Vd: // Check to see if the employee is eligible for full benefits if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) if (employee.isEligibleForFullBenefits()) - Thay v狸 ph畉i vi畉t comment v 1 畛ng logic nh動 tr棚n. Ta ch畛 c畉n t畛ng ch炭ng vo hm v 畉t t棚n d畛 hi畛u th狸 code clean h董n.
  • 25. 3.3. QUY T畉C V畛I COMMENTS 2. Comment t畛t v h畛p l箪 Vd: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved. // Released under the terms of the GNU General Public License version 2 or later. - Khi publish d畛 叩n th狸 ta n棚n vi畉t comment th畉 no vo source 畛 n坦i quy畛n s畛 h畛u, version...
  • 26. 3.3. QUY T畉C V畛I COMMENTS 3. Bad Comments - a ph畉n ch炭ng ta r董i vo 但y. - C坦 nhi畛u l炭c ta kh担ng c畉n comment, nh動ng ta l畉i c畉m th畉y c畉n comment. v畉y l ta ginh th畛i gian 畛 vi畉t comment. Vd: ==> Ta c坦 th畛 th畉y o畉n comment tr棚n c坦 th畛 c坦 箪 ngh挑a no 坦 v畛i ng動畛i vi畉t, nh動ng ch畉c ch畉n s畉 v担 ngh挑a v畛i reader. - Ta c坦 th畛 hi畛u n畉u r董i vo catch th狸 s畉 kh担ng c坦 file no 動畛c load. - Nh動ng n畉u file 動畛c load th狸 s畉 load 畛 但u, load l炭c no (t叩c gi畉 ch動a n坦i b棚n tr棚n)
  • 27. 3.3. QUY T畉C V畛I COMMENTS 4. Redundant Comments Vd: - Ta th畉y comment tr棚n kia l s畛 l畉p l畉i th担ng tin c畛a hm, kh担ng nh畛ng th畉 n坦 c嘆n cho ta bi畉t it th担ng tin h董n c畛a hm. N畉u 畛c l畉n 畉u vo comment b畉n s畉 kh担ng hi畛u g狸.
  • 28. 3.3. QUY T畉C V畛I COMMENTS 5. Noise Comments, Comments sai l棚ch - Nhi畛u khi comments th畉t s畛 l noise. N坦 kh担ng th畉t s畛 cung c畉p cho ta th担ng tin m畛i g狸 c畉. Vd: /** * @param title The title of the CD * @param author The author of the CD * @param tracks The number of tracks on the CD * @param durationInMinutes The duration of the CD in minutes */ public void addCD(String title, String author, int tracks, int durationInMinutes) { CD cd = new CD(); cd.title = title; cd.author = author; cd.tracks = tracks; cd.duration = duration; cdList.add(cd); } /** * Default constructor. */ protected AnnualDateRule() {} /** The day of the month. */ private int dayOfMonth; /** * Returns the day of the month. * * @return the day of the month. */ public int getDayOfMonth() { return dayOfMonth; }
  • 29. 3.3. QUY T畉C V畛I COMMENTS 6. Commented-Out Code - Kh担ng bao gi畛 n棚n lm i畛u ny. - Ng動畛i sau 畛c s畉 th畉y kh坦 hi畛u, v kh担ng d叩m x坦a v狸 ng畛 n坦 quan tr畛ng. - N坦 c嘆n g但y ra hi畛u l畉m. Do 坦 t畛t nh畉t n棚n x坦a i lu担n. InputStreamResponse response = new InputStreamResponse(); response.setBody(formatter.getResultStream(), formatter.getByteCount()); // InputStream resultsStream = formatter.getResultStream(); // StreamReader reader = new StreamReader(resultsStream); // response.setContent(reader.read(formatter.getByteCount()));
  • 30. 3.4. 畛NH D畉NG CODE (FORMATTING) 1. Vertical Formatting 2. Variable Declarations Instance variables Dependent Functions. Horizontal Formatting Indentation Breaking Indentation Team Rules
  • 31. 3.4. 畛NH D畉NG CODE (FORMATTING) 1. Vertical Formatting - S畛 d嘆ng trong 1 file t湛y theo c叩c l畉p tr狸nh vi棚n vi畉t code c畛a h畛 th畉 no. - Nh動ng m畛t file n棚n c坦 鱈t nh畉t 10 d嘆ng v t畛i a l 500 d嘆ng, th動畛ng trung b狸nh l 150-300. - Nh動 v畉y code s畉 kh担ng qu叩 l畛n 畛 畛c hi畛u 1 file. 2. Variable Declarations - Ta n棚n khai b叩o bi畉n g畉n n董i m n坦 s畛 d畛ng nh畉t c坦 th畛. B畛i v狸 hm r畉t ng畉n, bi畉n local n棚n xu畉t hi畛n 畛 畉u c畛a hm. - Bi畉n i畛u khi畛n th狸 n棚n khai b叩o lu担n trong v嘆ng l畉p. Vd:
  • 32. 3.4. 畛NH D畉NG CODE (FORMATTING) 3. Instance variables - Bi畉n th畛 hi畛n th狸 n棚n khai b叩o 畛 ngay 畉u c畛a class. i畛u quan tr畛ng 畛 但y l c叩c bi畉n instance th狸 n棚n khai b叩o c湛ng 1 n董i, 畛 reader c坦 th畛 th畛 bi畉t m 畛c.
  • 33. 3.4. 畛NH D畉NG CODE (FORMATTING) 4. Dependent Functions. - N畉u c坦 1 hm g畛i hm kh叩c. Th狸 n棚n 畉t hm g畛i tr棚n 畉u. - Nh動 v畉y reader c坦 th畛 畛c hi畛u theo 1 c叩ch t畛 nhi棚n theo top-down. 5. Horizontal Formatting - L畛i khuy棚n l n棚n 畛 120 k箪 t畛 l max tr棚n 1 d嘆ng. - N棚n 畛 箪 畉n kho畉ng tr畉ng gi畛a c叩c k箪 t畛.
  • 34. 3.4. 畛NH D畉NG CODE (FORMATTING) 6. Breaking Indentation - 担i l炭c ta g畉p vi tr動畛ng h畛p m ta c坦 th畛 ph叩 v畛 動畛c vi畛c l湛i 畉u d嘆ng. Vd: --> M畉c d湛 vi畛c lm ny r炭t g畛n 動畛c s畛 d嘆ng code, nh動ng n坦 l畉i lm cho ta kh坦 nh狸n h董n, t畛t nh畉t n棚n 畛 d畉ng chu畉n nh動 b棚n d動畛i.
  • 35. 3.4. 畛NH D畉NG CODE (FORMATTING) 7. Team Rules - M畛i programmer 畛u c坦 formatting rule ri棚ng. Nh動ng n畉u anh ta tham gia vo 1 team th狸 team 坦 ph畉i c坦 rule r探 rng v chi ti畉t. - C畉 nh坦m c畉n th畛ng nh畉t 1 rule. Kh担ng n棚n t畛n t畉i 箪 ki畉n c叩 nh但n r畉ng c坦 ng動畛i kh担ng th鱈ch theo rule ny. - H達y nh畛, h畛 th畛ng ph畉n m畛m t畛t l t畉p h畛p c叩c ti li畛u 畛c t畛t. Ng動畛i 畛c ch畉p 動畛c style c畛a team 坦.