Books

[Clean Code (ํด๋ฆฐ์ฝ”๋“œ)] ch.2 ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„

DAHLIA CHOI 2022. 12. 11. 02:38

์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ๋ฐํ˜€๋ผ

์ข‹์€ ์ด๋ฆ„์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค์ง€๋งŒ ์ข‹์€ ์ด๋ฆ„์œผ๋กœ ์ ˆ์•ฝํ•˜๋Š” ์‹œ๊ฐ„์€ ํ›จ์”ฌ ๋” ๋งŽ๋‹ค.

๋ณ€์ˆ˜, ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค์™€ ๊ฐ™์ด ์กด์žฌ ์ด์œ , ์ˆ˜ํ–‰ ๊ธฐ๋Šฅ์„ ๋”ฐ๋กœ ์ฃผ์„์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

int d;

์ด๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ?

์‹œ๊ฐ„? ๊ฑฐ๋ฆฌ? ์œ„์— ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ฃผ์„์ด ์—†์œผ๋ฉด ๋ณ€์ˆ˜์˜ ์˜๋„์™€ ์˜๋ฏธ๋Š” ์•Œ์•„์ฑ„๊ธฐ ํž˜๋“ค๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์œผ๋กœ ์ง€์–ด์•ผ ํ•œ๋‹ค.

int fileAgeInDays;

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

public list<int[]> getThem(){
	List<int[]> list1 = new ArrayList<int[]>();
	for (int[] x : theList)
		if (x[0] == 4)
			list1.add(x);
	return list1;
}

๊ฒจ์šฐ 6์ค„๋ฐ–์— ์•ˆ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๋‹ค.

์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ ๋‹จ์ˆœ์„ฑ์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ์˜ ํ•จ์ถ•์„ฑ์ด๋‹ค.

๐Ÿ‘‰ ์ฝ”๋“œ์˜ ๋งฅ๋ฝ์ด ์ฝ”๋“œ ์ž์ฒด์— ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

 

์œ„ ์ฝ”๋“œ์—๋Š” ์ฃผ์„ ์—†์ด ์ •๋ณด ์ œ๊ณต์ด ๊ฐ€๋Šฅํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์–ด๋– ํ•œ ์ •๋ณด๋„ ๋“ค์–ด์žˆ์ง€ ์•Š๋‹ค.

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ง€๋ขฐ ์ฐพ๊ธฐ ๊ฒŒ์ž„์„ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

 

๊ทธ๋Ÿผ theList๋Š” ๊ฒŒ์ž„ํŒ์ด๋ฉฐ, ์ด ๋ณ€์ˆ˜๋ฅผ gameBoard๋ผ๊ณ  ๋ฐ”๊ฟ”๋ณด์ž.

public List<int[]> gatFlaggedCells(){
	List<int[]> flaggedCells = new ArrayList<int[]>();
	for (int[] cell : gameBoard)
		if (cell [STATUS_VALUE] == FLAGGED)
			flaggedCells.add(cell);
	return flaggedCells;
} 

์ฒ˜์Œ ์ฝ”๋“œ์™€ ๋น„๊ตํ•ด์„œ 0๋ฒˆ์งธ ๊ฐ’์€ ์นธ ์ƒํƒœ๋ฅผ ๋œปํ•˜๋ฉฐ, 4๋Š” ๊นƒ๋ฐœ์ด ๊ฝ‚ํžŒ ์ƒํƒœ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

์ฝ”๋“œ์˜ ๋‹จ์ˆœ์„ฑ์€ ๋ณ€ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ฐœ๋…์— ์ด๋ฆ„์„ ๋ถ™์ž„์œผ๋กœ์จ ์ฝ”๋“œ๋Š” ๋”์šฑ ๋ช…ํ™•ํ•ด์กŒ๋‹ค.

 

โž• ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋” ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

public List<int[]> gatFlaggedCells(){
	List<int[]> flaggedCells = new ArrayList<int[]>();
	for (int[] cell : gameBoard)
		if (cell.isFlagged())
			flaggedCells.add(cell);
	return flaggedCells;
} 

๊นƒ๋ฐœ์ด ๊ฝ‚ํ˜”๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ๋” ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ํ”ผํ•˜๋ผ

โœ๏ธ ๊ทธ๋ฆ‡๋˜๋‹ค๋Š” ‘์–ด๋–ค ์ผ์ด ์‚ฌ๋ฆฌ์— ๋งž์ง€ ์•„๋‹ˆํ•˜๋‹ค’๋ผ๋Š” ๋œป์ด๋‹ค.

 

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ฝ”๋“œ์— ๊ทธ๋ฆ‡๋œ ๋‹จ์„œ๋ฅผ ๋‚จ๊ฒจ์„œ๋Š” ์•ˆ ๋œ๋‹ค.
  • ๋„๋ฆฌ ์“ฐ์ด๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๋‹จ์–ด๋ฅผ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•ด๋„ ์•ˆ๋œ๋‹ค.

 

EX) hp, aix, sco๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ์œ ๋‹‰์Šค ํ”Œ๋žซํผ์ด๋‚˜ ์œ ๋‹‰์Šค ๋ณ€์ข…์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด๋ฆ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ง๊ฐ ์‚ผ๊ฐํ˜•์˜ ๋น—๋ณ€(hypotenuse)์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” hp๊ฐ€ ํ›Œ๋ฅญํ•œ ์•ฝ์–ด์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์—ฌ๋Ÿฌ ๊ณ„์ •์„ ๋ฌถ์„ ๋•Œ ์‹ค์ œ List๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด List๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์„œ๋„ ์•ˆ๋œ๋‹ค.
  • ์„œ๋กœ ํก์‚ฌํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•œ๋‹ค.
  • ์œ ์‚ฌํ•œ ๊ฐœ๋…์€ ์œ ์‚ฌํ•œ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. → ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๋Š” ํ‘œ๊ธฐ๋ฒ•์€ ๊ทธ๋ฆ‡๋œ ์ •๋ณด์ด๋‹ค.
  •  

๐ŸŒฑ ์ด๋ฆ„์œผ๋กœ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋”์ฐํ•œ ์˜ˆ๊ฐ€ ์†Œ๋ฌธ์ž L์ด๋‚˜ ๋Œ€๋ฌธ์ž O์ด๋‹ค.

why? ์†Œ๋ฌธ์ž L์€ ์ˆซ์ž 1์ฒ˜๋Ÿผ ๋ณด์ด๊ณ , ๋Œ€๋ฌธ์ž O๋Š” ์ˆซ์ž 0์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์˜๋ฏธ ์žˆ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ผ

โœ๏ธ ๋ถˆ์šฉ์–ด๋Š” ‘์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋‹จ์–ด’๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ๋ถˆ์šฉ์–ด ์‚ฌ์šฉ์„ ์ง€์–‘ํ•œ๋‹ค.

ProductInfo๋ž‘ ProductData๋Š” ์–ด๋–ค ์˜๋ฏธ์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฐ€. ๊ฐœ๋…์„ ๋”ฑํžˆ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์€ ์ฑ„ ๋ถˆ์šฉ์–ด์ธ Info, Data๋ฅผ ๋ถ™์ธ ๊ฒƒ์ด๋‹ค.

getActiveAccount(), getActiveAccounts(), getActiveAccountInfo() ์ค‘์— ์ด ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์–ด๋А ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ๊นŒ?

โญ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ฐจ์ด๋ฅผ ์•Œ๋„๋ก ์ด๋ฆ„์„ ์ง€์–ด๋ผ

 

๋ฐœ์Œํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

class DtaRcrd102{
	private Date genymdhms;
	private Date modymdhms;
	private final String qszqint = "102";
};
class Customer{
	private Date generationTimestamp;
	private Date modificationTimestamp;
	private final String recordId = "102";
};

๋‘˜ ์ค‘ ๋น„๊ตํ•ด๋ณด์ž. ๋ฌด์—‡์ด ๋” ์ข‹์€ ์ฝ”๋“œ์ด๊ฒ ๋Š”๊ฐ€?

 

์ฒซ ๋ฒˆ์งธ๋„ ์ถฉ๋ถ„ํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์–ด๋А ํšŒ์‚ฌ๋Š” genymdhms(generate date, year, month, day, hour, minute, second)๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋‹จ์–ด๋ฅผ ๋งํ•˜๊ธฐ ์‰ฝ๊ฒŒ “์   ์™€์ด ์—  ๋”” ์—์ด์ทจ ์—  ์—์Šค”๋ผ๊ณ  ๋ฐœ์Œํ•˜๊ฑฐ๋‚˜ “์   ์•ผ ๋ฌด๋‹ค ํž˜์ฆˆ”๋ผ๊ณ  ๋ฐœ์Œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋‹จ์–ด๋Š” ์ƒˆ๋กœ์šด ์ง์›์ด ์˜จ๋‹ค๋ฉด ์ผ์ผ์ด ์„ค๋ช…์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ, ์ง€์ ์ธ ๋Œ€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ๋‘ ๋ฒˆ์งธ์ฒ˜๋Ÿผ generationTimestamp ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„๊ณผ ์ƒ์ˆ˜๋Š” ํ…์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์‰ฝ๊ฒŒ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

 

๐ŸŒฑ e๋ผ๋Š” ๋ฌธ์ž๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค. ์˜์–ด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฌธ์ž์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ๊ฒ€์ƒ‰์ด ์–ด๋ ต๋‹ค. ์ด๋Ÿฐ ๊ด€์ ์—์„œ๋Š” ๊ธด ์ด๋ฆ„์ด ์งง์€ ์ด๋ฆ„๋ณด๋‹ค ์ข‹๋‹ค.

์ฆ‰, ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ด ์ƒ์ˆ˜๋ณด๋‹ค ์ข‹๋‹ค.

for (int j = 0; j <34; j++){
	s += (t[j]*4)/5;
}
int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEKS = 5;
int sum = 0;
for (int j = 0; j <NUMBER_OF_TASKS; j++){
	int realTaskDays = taskEsimate[j] + realDaysPerIdealDay;
	int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEKS);
	sum += realTaskWeeks;
}

์œ„ ๋‘ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด๋ณด์ž. s๋Œ€์‹  ์‚ฌ์šฉํ•œ sum์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ์ง€๋งŒ ์ตœ์†Œํ•œ ๊ฒ€์ƒ‰์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ, WORK_DAYS_PER_WEEK๋ฅผ ์ฐพ๊ธฐ๋Š” ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด๊ฐ€

โญ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์ฝ”๋“œ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

 

์ธ์ฝ”๋”ฉ์„ ํ”ผํ•ด๋ผ

โœ๏ธ ์ธ์ฝ”๋”ฉ์€ ๋ฌธ์ž๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ง„๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

(์—ฌ๊ธฐ์„œ๋Š” ๋ญ”๊ฐ€.. ๋ฌธ์ž์— ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์–ด๋–ค ์œ ํ˜•์ธ์ง€ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋А๋‚Œ์ธ ๋“ฏํ•˜๋‹ค.)

 

์ด๋ฆ„์—๋„ ์ธ์ฝ”๋”ฉํ•  ์ •๋ณด๊ฐ€ ์•„์ฃผ ๋งŽ์€๋ฐ ์œ ํ˜•์ด๋‚˜ ๋ฒ”์œ„ ์ •๋ณด๊นŒ์ง€ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๊ทธ๋งŒํผ ์ด๋ฆ„์„ ํ•ด๋…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

๋˜ํ•œ, ์ธ์ฝ”๋”ฉ ์–ธ์–ด๊นŒ์ง€ ์ตํžˆ๋ผ๋Š” ์š”๊ตฌ๋Š” ๋งค์šฐ ๋น„ํ•ฉ๋ฆฌ์ ์ด๋‹ค.

 

ํ—๊ฐ€๋ฆฌ์‹ ํ‘œ๊ธฐ๋ฒ•

→ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜์˜ ์ธ์ž ์ด๋ฆ„ ์•ž์— ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ์ฝ”๋”ฉ ๊ทœ์น™์ด๋‹ค.

  • ํฌํŠธ๋ž€์€ ์ฒซ ๊ธ€์ž๋กœ ์œ ํ˜•์„ ํ‘œํ˜„ํ–ˆ๋‹ค.
  • ์ดˆ์ฐฝ๊ธฐ ๋ฒ ์ด์‹์€ ๊ธ€์ž ํ•˜๋‚˜์— ์ˆซ์ž ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉํ–ˆ๋‹ค.

๊ณผ๊ฑฐ์—๋Š” ํ—๊ฐ€๋ฆฌ์‹ ํ‘œ๊ธฐ๋ฒ•์„ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค.

๐Ÿ‘‰ why? ๊ณผ๊ฑฐ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ ๊ฒ€ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํƒ€์ž…์„ ๊ธฐ์–ตํ•  ๋‹จ์„œ๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค.

๐ŸŒฑ ํ•˜์ง€๋งŒ ์š”์ฆ˜ ๋‚˜์˜ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ํ›จ์”ฌ ๋งŽ์€ ํƒ€์ž…์„ ์ง€์›ํ• ๋ฟ๋”๋Ÿฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ๊ธฐ์–ตํ•˜๊ณ  ๊ฐ•์ œํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์— ํƒ€์ž…์„ ์ธ์ฝ”๋”ฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๋‹ค.

 

๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ ‘๋‘์–ด

์ด์ œ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— m_์ด๋ผ๋Š” ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋Š” ์ ‘๋‘์–ด๊ฐ€ ํ•„์š” ์—†์„ ์ •๋„๋กœ ์ž‘์•„์•ผ ํ•œ๋‹ค.
  • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ์ƒ‰์ƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๋ˆˆ์— ๋„๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” IDE๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋งˆ๋•…ํ•˜๋‹ค.

 

์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค์™€ ๊ตฌํ˜„ ํด๋ž˜์Šค

๋•Œ๋กœ๋Š” ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋„ํ˜•์„ ์ƒ์„ฑํ•˜๋Š” ABSTRACT FACTORY๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค์™€ ๊ตฌ์ฒด ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

→ ๋‘ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ์ง“๋Š” ๊ฒŒ ์ข‹์„๊นŒ?

๐ŸŒฑ ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค์— ์ ‘๋‘์–ด I๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์€ ์ฃผ์˜๋ฅผ ํฉํŠธ๋ฆฌ๊ณ  ๊ณผ๋„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ตฌํ˜„ ํด๋ž˜์Šค ์ด๋ฆ„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ตฌํ˜„ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ธ์ฝ”๋”ฉํ•œ๋‹ค.

how? ShapeFactoryImp ๋˜๋Š” CShapeFactory๊ฐ€ IShapeFactory๋ณด๋‹ค ์ข‹๋‹ค.

 

์ž์‹ ์˜ ๊ธฐ์–ต๋ ฅ์„ ์ž๋ž‘ํ•˜์ง€ ๋งˆ๋ผ

๋…์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉด์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ณธ์ธ์ด ์•„๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๋งˆ์Œ์ด ๋“ ๋‹ค๋ฉด ๊ทธ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค.

๐ŸŒฑ ๋ฌธ์ž ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. (but, ๋ฃจํ”„์—์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ณ€์ˆ˜ i, k, j๋Š” ๊ดœ์ฐฎ๋‹ค.)

 

โญ ๋ณ€์ˆ˜ r์ด ๋ฌด์—‡์ธ์ง€ ๊ธฐ์–ตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์•„์ฃผ ๋˜‘๋˜‘ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์ „๋ฌธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋‚จ๋“ค์ด ์ดํ•ดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋‚ด๋†“๋Š”๋‹ค.

 

ํด๋ž˜์Šค ์ด๋ฆ„

โญ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ฐ์ฒด ์ด๋ฆ„์€ ๋ช…์‚ฌ๋‚˜ ๋ช…์‚ฌ๊ตฌ๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.

ex) Customer, WiKiPage, Account, AddressParser

 

๋ฉ”์„œ๋“œ ์ด๋ฆ„

โญ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ๋™์‚ฌ๋‚˜ ๋™์‚ฌ๊ตฌ๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.

ex) postPayment , deletePage , save

Stirng name = employee.getName();
customer.setName("mike");
if (paycheck.isPost()) ...

์ ‘๊ทผ์ž → get
๋ณ€๊ฒฝ์ž → set
์กฐ๊ฑด์ž → is

๐ŸŒฑ ์ƒ์„ฑ์ž๋ฅผ ์ค‘๋ณต ์ •์˜ํ•  ๋•Œ๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Complex fulcrumPoint = Complex.FromRealNumber(23.0); -> good
Complex fulcrumPoint = new Complex(23.0);

// ์ƒ์„ฑ์ž ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๋ ค๋ฉด private๋กœ ์„ ์–ธํ•˜๊ธฐ!

 

๊ธฐ๋ฐœํ•œ ์ด๋ฆ„์€ ํ”ผํ•˜๋ผ

โญ ์žฌ๋ฏธ๋‚œ ์ด๋ฆ„๋ณด๋‹ค ๋ช…๋ฃŒํ•œ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋ผ

 

ํ•œ ๊ฐœ๋…์— ํ•œ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

๋˜‘๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํด๋ž˜์Šค๋งˆ๋‹ค ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ๋ถ€๋ฅด๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค.

๊ฐ๊ฐ์˜ ์ด๋ฆ„์„ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜๋ฉด ๊ณผ๊ฑฐ์˜ ์ฝ”๋“œ ์˜ˆ์ œ๋‚˜ ํ—ค๋”๋ฅผ ์‚ดํ”ผ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค๊ฒŒ ๋œ๋‹ค.

์ดํด๋ฆฝ์Šค๋‚˜ ์ธํ…”๋ฆฌ์ œ์ด ๋“ฑ ์ตœ์‹  IDE๋Š” ๋ฌธ๋งฅ์— ๋งž๋Š” ๋‹จ์„œ๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.

ํ•˜์ง€๋งŒ ์–ด๋А ์ •๋„๋งŒ ํžŒํŠธ๋ฅผ ์ค„ ๋ฟ ์ฃผ์„์€ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

DeviceManager์™€ ProtocolController๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€. ๋‘˜ ๋‹ค controller? ๋‘˜ ๋‹ค Manager? ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด ๋‹น์—ฐํžˆ ํƒ€์ž…๊ณผ ์—ญํ• ์ด ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

โญ์ฃผ์„์„ ๋’ค์ ธ๋ณด์ง€ ์•Š๊ณ ๋„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋…์ž์ ์ด๊ณ  ์ผ๊ด€์ ์ด์–ด์•ผ ํ•œ๋‹ค.

 

๋ง์žฅ๋‚œ์„ ํ•˜์ง€ ๋งˆ๋ผ

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด add๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ต์ผํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์น˜์ž.

๊ธฐ์กด์˜ add๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋”ํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋„์ถœํ•ด๋‚ด๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ค‘๊ฐ„์— ๊ฐ‘์ž๊ธฐ ์ƒˆ๋กœ์šด ๊ฐ’์ด ๋”ํ•ด์ง„๋‹ค๋ฉด ์ด ๋ฉ”์„œ๋“œ๋ฅผ add๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์„๊นŒ?

NO! ์ด๊ฒƒ์€ ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ง์žฅ๋‚œ์ด๋‹ค.

๐Ÿ‘‰ ์ด๋Ÿด ๊ฒฝ์šฐ์—๋Š” insert๋‚˜ append๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผ ํ•œ๋‹ค.

 

โญ ๋‹ค๋ฅธ ๊ฐœ๋…์— ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„๋ผ. ๋˜ํ•œ ํ•œ ๋‹จ์–ด๋ฅผ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„๋ผ.

 

ํ•ด๋ฒ• ์˜์—ญ์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

์ฝ”๋“œ๋ฅผ ์งœ๋Š” ์‚ฌ๋žŒ๋„ ์ฝ๋Š” ์‚ฌ๋žŒ๋„ ํ”„๋กœ๊ทธ๋ž˜๋จธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ „์‚ฐ ์šฉ์–ด, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„, ํŒจํ„ด ์ด๋ฆ„ ๋“ฑ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ด๋ฆ„์„ ๋ฌธ์ œ ์˜์—ญ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ํ˜„๋ช…ํ•˜์ง€ ๋ชปํ•˜๋‹ค.

 

โญ ๋”ฐ๋ผ์„œ, ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ต์ˆ™ํ•œ ๊ธฐ์ˆ  ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์ž.

 

๋ฌธ์ œ ์˜์—ญ์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

์ ์ ˆํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ ์šฉ์–ด ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฌธ์ œ ์˜์—ญ์—์„œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค.

์šฐ์ˆ˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ์„ค๊ณ„์ž๋ผ๋ฉด ํ•ด๋ฒ• ์˜์—ญ๊ณผ ๋ฌธ์ œ ์˜์—ญ์€ ๊ตฌ๋ถ„ํ•  ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋ฌธ์ œ ์˜์—ญ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ผ๋ฉด ๋ฌธ์ œ ์˜์—ญ์—์„œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค.

 

์˜๋ฏธ ์žˆ๋Š” ๋งฅ๋ฝ์„ ์ถ”๊ฐ€ํ•˜๋ผ

firstName, lastName, street, houseNumber๋ฅผ ์ญ‰ ํ›‘์–ด๋ณด๋ฉด ์ฃผ์†Œ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ firstName๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?

์ด๋Ÿด ๋•Œ๋Š” addr๋ผ๋Š” ์ ‘๋‘์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋งฅ๋ฝ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

private void printGuessStatistics(char candidate, int count){
	String number;
	String verb;
	String pluralModifier;
	if (count == 0){
		number = "no";
		verb = "are";
		pluralModifier = "s";
	} else if (count == 1){
		number = "1";
		verb = "is";
		pluralModifier = "";
	} else{
		number = Integer.toString(count);
		verb = "are";
		pluralModifier = "s";
	}
	String guessMessage = String.format("There %s %s %s%s", verb, number, candidate, pluralModifier);
	print(guessMessage);
}

์ด ์ฝ”๋“œ์—์„œ ํ•จ์ˆ˜๋Š” ๋งฅ๋ฝ ์ผ๋ถ€๋งŒ์„ ์ œ๊ณตํ•˜๋ฉฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‚˜๋จธ์ง€ ๋งฅ๋ฝ์„ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค ์ฝ๊ณ  ๋‚˜์„œ์•ผ number, verb, pluralModifier๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ†ต๊ณ„ ์ถ”์ธก์— ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋…์ž๊ฐ€ ๋งฅ๋ฝ์„ ์œ ์ถ”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋งฅ๋ฝ์ด ๋ถ„๋ช…ํ•ด์ง€๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์ž.

GuessStaticsMessage๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋ณ€์ˆ˜๋ฅผ ํด๋ž˜์Šค์— ๋„ฃ์–ด์„œ ๋งฅ๋ฝ์„ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

public class GuessStaticsMessage{
	private String number;
	private String verb;
	private String pluralModifier;

	public String make(char candidate, int count){
		createPluralDependentMessage(count);
		return String.format("There %s %s %s%s", verb, number, candidate, pluralModifier);
	}

	private void createPluralDependentMessageParts(int count){
		if (count == 0){
			threrAreNoLetters();
		}else if (count == 1){
			thereIsOneLetter();
		}else{
			thereAreManyLetters();
		}
	}

	private void thereAreManyLetters(int count){
		number = Integer.toString(count);
		verb = "are";
		pluralModifier = "s";
	}
	
	private void thereIsOneLetter(){
		number = "1";
		verb = "is";
		pluralModifier = "";
	}

	private void thereNoLetters(){
		number = "no";
		verb = "are";
		pluralModifier = "s";
	}
}

โญ ๋Œ€๋‹ค์ˆ˜์˜ ์ด๋ฆ„์€ ์Šค์Šค๋กœ ์˜๋ฏธ๊ฐ€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค, ํ•จ์ˆ˜, ์ด๋ฆ„ ๊ณต๊ฐ„์— ๋„ฃ์–ด ๋งฅ๋ฝ์„ ๋ถ€์—ฌํ•œ๋‹ค. ๋ชจ๋“  ๋ฐฉ๋ฒ•์ด ์‹คํŒจํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ์œผ๋กœ ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ธ๋‹ค.

 

๋ถˆํ•„์š”ํ•œ ๋งฅ๋ฝ์„ ์—†์• ๋ผ

accountAddress์™€ customerAddress๋Š” Address ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋กœ๋Š” ์ข‹์€ ์ด๋ฆ„์ด์ง€๋งŒ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ๋ชปํ•˜๋‹ค.

 

Address๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ ํ•ฉํ•˜๋‹ค.

 

๋งŒ์•ฝ ํฌํŠธ ์ฃผ์†Œ, MAC ์ฃผ์†Œ, ์›น ์ฃผ์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด PostalAddress, MAC, URI๋ผ๋Š” ์ด๋ฆ„์ด ์ ํ•ฉํ•  ๊ฒƒ์ด๋‹ค.

 

โญ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์งง์€ ์ด๋ฆ„์ด ๊ธด ์ด๋ฆ„๋ณด๋‹ค ์ข‹๋‹ค. ๋‹จ, ์˜๋ฏธ๊ฐ€ ๋ถ„๋ช…ํ•œ ๊ฒฝ์šฐ์— ํ•œํ•ด์„œ๋‹ค. ์ด๋ฆ„์— ๋ถˆํ•„์š”ํ•œ ๋งฅ๋ฝ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•œ๋‹ค.