CleanCode TIL (2022.01.27)

Henry Choยท2022๋…„ 1์›” 27์ผ
0

๋…ธ๊ฐœ๋ถ

๋ชฉ๋ก ๋ณด๊ธฐ
7/31

DAY 7

๐Ÿ”–ย ์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„ : 3. ํ•จ์ˆ˜ (54~65p)


๐Ÿค“ย ์ฑ…์—์„œ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค์ง€ ๋งˆ๋ผ!

  • ํ•จ์ˆ˜์—์„œ ํ•œ ๊ฐ€์ง€ ํ•˜๊ธฐ๋กœ ์•ฝ์†ํ•ด๋†“๊ณ  ๋ชฐ๋ž˜ ๋‹ค๋ฅธ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค์ง€๋งˆ๋ผ
  • ์‹œ๊ฐ„์ ์ธ ๊ฒฐํ•ฉ ์ด๋‚˜ ์ˆœ์„œ ์ข…์†์„ฑ์„ ์ดˆ๋ž˜ํ•œ๋‹ค
public class UserValidator {
	private Cryptographer cryptographer;
	
	public boolean checkPassword(String userName, String password) {
		User user = UserGateway.findByName(userName);
		if (user != User.NULL) {
			String codedPhrase = user.getPhraseEncodedByPassword(); 
			String phrase = cryptographer.decrypt(codedPhrase, password); 
			if ("Valid Password".equals(phrase)) {
				Session.initialize();
				return true; 
		}
	}
	return false; 
	}
}

Session.initialize() ๋Š” ์˜๋„์น˜ ์•Š๊ฒŒ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ง€์›Œ๋ฒ„๋ฆฐ๋‹ค

โ†’ ์ ์–ด๋„ ์ด๋ฆ„์„ checkPasswordAndInitializeSession ์œผ๋กœ ๋ฐ”๊พธ์ž

์ถœ๋ ฅ ์ธ์ˆ˜

  • appendFooter(s); ๋Š” ๋ฌด์–ธ๊ฐ€์— s๋ฅผ ๋ฐ”๋‹ฅ๊ธ€๋กœ ์ฒจ๋ถ€ํ•˜๋Š”์ง€ s์— ๋ฐ”๋‹ฅ๊ธ€์„ ์ฒจ๋ถ€ํ•  ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค
  • ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” ์ถœ๋ ฅ์ธ์ˆ˜ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค โ†’ this๋ฅผ ์‚ฌ์šฉํ•˜๋ผ report.appendFooter()

๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ!

  • ํ•จ์ˆ˜๋Š” ๋ญ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ญ”๊ฐ€์— ๋‹ตํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ!
  • ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ ํ•˜๊ฑฐ๋‚˜
  • ๋‘˜ ๋‹ค ํ•˜๋ฉด ํ˜ผ๋ž€์„ ์ดˆ๋ž˜
    public boolean set(String attribute, String value);
    if (set("username", "unclebob"))...
    set์ด ํ˜•์šฉ์‚ฌ(p.p์ •ํ•ด์ง„-์กฐํšŒ)์ธ์ง€ ๋™์‚ฌ(์ •ํ•˜๋‹ค-๋ช…๋ น)์ธ์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ์˜๋ฏธ๊ฐ€ ๋ชจํ˜ธ โ†’ ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•ด ํ˜ผ๋ž€์„ ๋ฟŒ๋ฆฌ๋ฝ‘์ž
    if (attributeExists("username")) { 
    	setAttribute("username", "unclebob"); 
    	...
    }

์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ!

  • ๋ช…๋ นํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์€ ๋ช…๋ น/์กฐํšŒ ๋ถ„๋ฆฌ ๊ทœ์น™์„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์œ„๋ฐ˜ if๋ฌธ์—์„œ ๋ช…๋ น์„ ํ‘œํ˜„์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์œ„๋ฐ˜ ์‚ฌ๋ก€ ๋งŽ๋‹ค
    if (deletePage(page) == E_OK) {
    	if (registry.deleteReference(page.name) == E_OK) {
    		if (configKeys.deleteKey(page.name.makeKey()) == E_OK) { 
    			logger.log("page deleted");
    		} else {
    			logger.log("configKey not deleted");
    		}
    	} else {
    			logger.log("deleteReference from registry failed"); 
    		}
    	} else {
    		logger.log("delete failed"); 
    		return E_ERROR;
    }
    โ†’ ์˜ค๋ฅ˜์ฝ”๋“œ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ˜ธ์ถœ์ž๋Š” ๊ณง๋ฐ”๋กœ ์˜ค๋ฅ˜์ฝ”๋“œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ
    try {
    	deletePage(page); 
    	registry.deleteReference(page.name); 
    	configKeys.deleteKey(page.name.makeKey());
    }
    catch (Exception e) {
    	logger.log(e.getMessage()); 
    }
    โ†’ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์ฝ”๋“œ๊ฐ€ ์›๋ž˜ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ๊น”๋”

Try/Catch ๋ธ”๋ก ๋ฝ‘์•„๋‚ด๊ธฐ

  • try/catch ๋ธ”๋ก์€ ์ฝ”๋“œ ๊ตฌ์กฐ ํ˜ผ๋ž€ ์•ผ๊ธฐ, ์ •์ƒ๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋™์ž‘์„ ๋’ค์„ž์Œ
  • try/catch ๋ธ”๋ก์„ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค
    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());
    }

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ ํ•œ๊ฐ€์ง€ ์ž‘์—…์ด๋‹ค

  • ํ•จ์ˆ˜๋Š” โ€˜ํ•œ ๊ฐ€์ง€โ€™ ์ž‘์—…๋งŒ โ†’ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ โ€˜ํ•œ ๊ฐ€์ง€โ€™ ์ž‘์—… โ†’ ํ•จ์ˆ˜์— try ๊ฐ€ ์žˆ๋‹ค๋ฉด try๋กœ ์‹œ์ž‘ํ•ด catch/finally ๋ฌธ์œผ๋กœ ๋๋‚˜์•ผํ•œ๋‹ค

Error.java ์˜์กด์„ฑ ์ž์„

  • ์˜ค๋ฅ˜์ฝ”๋“œ๋ฐ˜ํ™˜? โ†’ ์–ด๋””์„ ๊ฐ€ ์˜ค๋ฅ˜์ฝ”๋“œ๋ฅผ ์ •์˜ํ–ˆ๋‹ค(ํด๋ž˜์Šค, enum...)
public enum Error { 
	OK,
	INVALID,
	NO_SUCH,
	LOCKED, OUT_OF_RESOURCES, WAITING_FOR_EVENT;
}

์˜์กด์„ฑ ์ž์„: ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ Error enum์„ import ํ•ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Error enum ์ด ๋ณ€ํ•˜๋ฉด ํ•ด๋‹น enum ์‚ฌ์šฉํ•˜๋Š” class์ „๋ถ€๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ณ  ๋ฐฐ์น˜ํ•ด์•ผํ•œ๋‹ค.

โ†’ ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ์˜ˆ์™ธ๋Š” Exception ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ

โ†’ ์žฌ์ปดํŒŒ์ผ/๋ฐฐ์น˜ ์—†์ด๋„ ์ƒˆ ์˜ˆ์™ธ ํด๋ž˜์Šค ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ๋ผ

  • include ๋ฐฉ๋ฒ•์œผ๋กœ ์ค‘๋ณต ์—†์• ๊ธฐ
  • RDMBS ๋Š” ์ •๊ทœํ™”๋กœ ์ค‘๋ณต ์ œ๊ฑฐ
  • ๊ฐ์ฒด์ง€ํ–ฅ์€ ์ฝ”๋“œ๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋ชฐ์•„ ์ค‘๋ณต ์ œ๊ฑฐ

๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • Edsger Dijkstra์˜ ๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™
    • ๋ชจ๋“  ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ๋‚ด ๋ชจ๋“  ๋ธ”๋ก์— entry ์™€ exit์ด ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
    • ํ•จ์ˆ˜์— return๋ฌธ์€ ํ•˜๋‚˜์—ฌ์•ผํ•œ๋‹ค โ†’ loop ๋‚ด break, continue, goto โŒ
  • ํ•จ์ˆ˜๊ฐ€ ์•„์ฃผ ํด ๋•Œ๋งŒ ์ด์ต์„ ์ œ๊ณตํ•˜๋Š” ์›์น™ โ†’ ํ•จ์ˆ˜๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค๋ฉด return, break, continue๋ฅผ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค โ†’ ๊ทธ๋ž˜๋„ goto(ํฐํ•จ์ˆ˜์ „์šฉ)๋Š” ํ”ผํ•˜๋ผ

ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์ฃ ?

  • ์ฒ˜์Œ์—๋Š” ๊ธธ๊ณ  ๋ณต์žกํ•˜๊ฒŒ
  • ๋“ค์—ฌ์“ฐ๊ธฐ, ์ค‘๋ณต, ์ธ์ˆ˜ ์—ฌ๋Ÿฌ๊ฐœ, ์ด๋ฆ„ ์ฆ‰ํฅ์ 
  • ํ•˜์ง€๋งŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•„์ˆ˜
  • ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง, ์ด๋ฆ„ ๋ณ€๊ฒฝ, ์ค‘๋ณต ์ œ๊ฑฐ, ๋ฉ”์„œ๋“œ ์ค„์ด๊ธฐ, ์ˆœ์„œ ๋ณ€๊ฒฝ, ํด๋ž˜์Šค ๋ถ„๋ฆฌ โ†’ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผ ์œ ์ง€ํ•จ์œผ๋กœ์„œ ์ด์ƒ์ ์ธ ํ•จ์ˆ˜ ์™„์„ฑ

๊ฒฐ๋ก 

  • ๋ชจ๋“  ์‹œ์Šคํ…œ์€ ๋„๋ฉ”์ธ ํŠนํ™” ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉฐ ํ•จ์ˆ˜๋Š” ๋™์‚ฌ, ํด๋ž˜์Šค๋Š” ๋ช…์‚ฌ
  • ์‹œ์Šคํ…œ์€ ๊ตฌํ˜„ํ•  ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ ํ’€์–ด๊ฐˆ ์ด์•ผ๊ธฐ

๐Ÿค”ย ๋– ์˜ค๋ฅด๋Š” ์ƒ๊ฐ

  • ๋‹ˆ๊ผฌ์ƒ˜์ด ๊ทธ ๋™์•ˆ ๊ฐ•์˜์—์„œ ํ•จ์ˆ˜๋“ค์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ์…จ๋˜ ๋‚ด์šฉ๋“ค์ด ์กฐ๊ธˆ์”ฉ ์ดํ•ด๊ฐ€ ๊ฐ€๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค!

๐Ÿ”Žย ์งˆ๋ฌธ

  • ์ถœ๋ ฅ์ธ์ˆ˜๊ฐ€ ๋ญ”๊ฐ€์š”? ํ•จ์ˆ˜์—๊ฒŒ ์ž‘์—…๊ฑฐ๋ฆฌ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๊ฐ€ ์ž‘์—…ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค http://soen.kr/lecture/ccpp/cpp1/6-3-3.htm

๐Ÿ“ย ์†Œ๊ฐ 3์ค„ ์š”์•ฝ

  • ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค์ง€ ๋งˆ๋ผ!
  • ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ!
  • ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ!
profile
Full stack tech visionary

0๊ฐœ์˜ ๋Œ“๊ธ€