[Book] ํด๋ฆฐ์ฝ”๋“œ - 3์žฅ ํ•จ์ˆ˜

2020. 12. 27. 16:09ยท๐Ÿ“ Book/โœ Clean Code

3์žฅ ํ•จ์ˆ˜

์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด๋“  ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋‹จ์œ„๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ํ‘œํ˜„ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
ํ•จ์ˆ˜์— ์–ด๋–ค ์†์„ฑ์„ ๋ถ€์—ฌํ•ด์•ผ ์ฒ˜์Œ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

1. ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์ฒซ์งธ ๊ทœ์น™์€ `์ž‘๊ฒŒ`์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ 5์ค„ ์ด๋‚ด๋กœ ์ค„์—ฌ์•ผ ๋งˆ๋•…ํ•˜๋‹ค.

 

2. ๋ธ”๋ก๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ

if ๋ฌธ, else, ๋ฌธ, while๋ฌธ ๋“ฑ์— ๋“ค์–ด๊ฐ€๋Š” ๋ธ”๋ก์€ ํ•œ ์ค„์ด์–ด์•ผ ํ•œ๋‹ค.

๋Œ€๊ฒŒ ๊ฑฐ๊ธฐ์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

3. ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด๋ผ

ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€๋งŒ์„ ์ž˜ํ•ด์•ผ ํ•œ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„น์…˜์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์–ด๋ ต๋‹ค.

 

4. ํ•จ์ˆ˜ ๋‹น ์ถ”์ƒํ™” ์ˆ˜์ค€์€ ํ•˜๋‚˜๋กœ

  • ํ•จ์ˆ˜๊ฐ€ ํ™•์‹คํžˆ ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ๋‚ด ๋ชจ๋“  ๋ฌธ์žฅ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•œ ํ•จ์ˆ˜ ๋‚ด์— ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์„ž์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ํŠน์ • ํ‘œํ˜„์ด ๊ทผ๋ณธ ๊ฐœ๋…์ธ์ง€ ์•„๋‹ˆ๋ฉด ์„ธ๋ถ€์‚ฌํ•ญ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋‚ด๋ ค๊ฐ€๊ธฐ ๊ทœ์น™(์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ”๋“œ ์ฝ๊ธฐ): ํ•œ ํ•จ์ˆ˜ ๋‹ค์Œ์—๋Š” ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์€ ํ•จ์ˆ˜๊ฐ€ ์˜จ๋‹ค. ์ฆ‰, ์œ„์—์„œ ์•„๋ž˜๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ฝ์œผ๋ฉด ํ•จ์ˆ˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋ฒˆ์— ํ•œ ๋‹จ๊ณ„์”ฉ ๋‚ฎ์•„์ง„๋‹ค.

 

5. Switch ๋ฌธ

switch ๋ฌธ์€ ์ž‘๊ฒŒ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค.

๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•ด ๊ฐ switch ๋ฌธ์„ ์ €์ฐจ์› ํด๋ž˜์Šค(์ถ”์ƒ ํŒฉํ† ๋ฆฌ)์— ์ˆจ๊ธฐ๊ณ  ์ ˆ๋Œ€๋กœ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

public abstract class Employee {
      public abstract boolean isPayday();
      public abstract Money calculatePay();
      public abstract void deliverPay(Money pay);
}
-----------------
public interface EmployeeFactory {
      Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
-----------------
public class EmployeeFactoryImpl implements EmployeeFactory {
      public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
		switch (r.type) {
			case COMMISSIONED:
				return new CommissionedEmployee(r);
			case HOURLY:
				return new HourlyEmployee(r);
			case  SALARIED:
				return new SalariedEmployee(r);
			default:
				throw new InvalidEmployeeType(r.type);
        }
    }
}
  1. swich ๋ฌธ์„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์— ๊ฝ๊ฝ ์ˆจ๊ธด๋‹ค.
  2. ํŒฉํ† ๋ฆฌ๋Š” switch ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ ์ ˆํ•œ Employee ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. calculatePay, isPayday, deliverPay ๋“ฑ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” Employee ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฑฐ์ณ ํ˜ธ์ถœ๋œ๋‹ค.
  4. ๋‹คํ˜•์„ฑ์œผ๋กœ ์ธํ•ด ์‹ค์ œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

6. ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด๋ผ

์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž ๋จธ๋ฆฟ์†์—์„œ๋„ ์„ค๊ณ„๊ฐ€ ๋šœ๋ ทํ•ด์ง€๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

 

7. ํ•จ์ˆ˜ ์ธ์ˆ˜

์ตœ์„ ์€ ์ž…๋ ฅ ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ(๋ฌดํ•ญ)์ด๋ฉฐ, ์ฐจ์„ ์€ ์ž…๋ ฅ ์ธ์ˆ˜๊ฐ€ 1๊ฐœ๋ฟ์ธ ๊ฒฝ์šฐ(๋‹จํ•ญ)์ด๋‹ค.

 

  • ๋งŽ์ด ์“ฐ๋Š” ๋‹จํ•ญ ํ˜•์‹: ์ธ์ˆ˜์— ์งˆ๋ฌธ์„ ๋˜์ง€๋Š” ๊ฒฝ์šฐ, ์ธ์ˆ˜๋ฅผ ๋ญ”๊ฐ€๋กœ ๋ณ€ํ™˜ํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฒคํŠธ
  • ์ดํ•ญ ํ•จ์ˆ˜: ์ง๊ต ์ขŒํ‘œ๊ณ„ ์ ๊ณผ ๊ฐ™์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ˆ˜ 2๊ฐœ๋ฅผ ์ทจํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ ์ ˆํ•˜๋‹ค.
  • ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ๊ณตํ‘œํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.
  • ์ถœ๋ ฅ ์ธ์ˆ˜๋Š” ํ”ผํ•ด์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜์—์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ์†ํ•œ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ•œ๋‹ค.

 

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

ํ•จ์ˆ˜์—์„œ ํ•œ ๊ฐ€์ง€๋ฅผ ํ•˜๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ•˜๊ณ ์„  ๋‚จ๋ชฐ๋ž˜ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

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

ํ•จ์ˆ˜๋Š” ๋ญ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ญ”๊ฐ€์— ๋‹ตํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๊ฐ์ฒด ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋‹ค.

 

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

๋ช…๋ น ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์€ ๋ช…๋ น/์กฐํšŒ ๋ถ„๋ฆฌ ๊ทœ์น™์„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•œ๋‹ค.

if (deletePage(page) == E_OK)

๋ฐ˜๋ฉด ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์›๋ž˜ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌ๋˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง„๋‹ค.

try {
	deletePage(page);
	registry.deleteReference(page.name);
	configKeys.deleteKey(page.name.makeKey());
}
catch(Exception e) {
	logger.log(e.getMessage());
}

 

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

์ฝ”๋“œ ๊ตฌ์กฐ์— ํ˜ผ๋ž€์„ ์ผ์œผํ‚ค๋ฉฐ ์ •์ƒ ๋™์ž‘๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋™์ž‘์„ ๋’ค์„ž๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ try/catch ๋ธ”๋ก์„ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด๋Š” ํŽธ์ด ์ข‹๋‹ค.

 

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

์ค‘๋ณต์„ ์—†์• ๋ฉด ๋ชจ๋“ˆ ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ๋†’์•„์ง„๋‹ค.

 

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

ํ•จ์ˆ˜๊ฐ€ ์ž‘๋‹ค๋ฉด return, break. continue๋ฅผ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค.

goto ๋ฌธ์€ ํฐ ํ•จ์ˆ˜์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ž‘์€ ํ•จ์ˆ˜์—์„œ๋Š” ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

 

14. ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์งœ๋‚˜์š”?

์ฒ˜์Œ์—๋Š” ๊ธธ๊ณ  ๋ณต์žกํ•˜๋‹ค.

ํ›„์— ์ฝ”๋“œ๋ฅผ ๋‹ค๋“ฌ๊ณ , ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ , ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ์ค„์ด๊ณ  ์ˆœ์„œ๋ฅผ ๋ฐ”๊พผ๋‹ค.

๋•Œ๋กœ๋Š” ์ „์ฒด ํด๋ž˜์Šค๋ฅผ ์ชผ๊ฐœ๊ธฐ๋„ ํ•œ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ์•ž์„œ ์„ค๋ช…ํ•œ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ํ•จ์ˆ˜๊ฐ€ ์–ป์–ด์ง„๋‹ค.

 

๊ฒฐ๋ก 

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์‹œ์Šคํ…œ์„ ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ ์ด์•ผ๊ธฐ๋กœ ์—ฌ๊ธด๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ผ๋Š” ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•ด ์ข€ ๋” ํ’๋ถ€ํ•˜๊ณ  ํ‘œํ˜„๋ ฅ์ด ๊ฐ•ํ•œ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์–ด ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด๊ฐ„๋‹ค.
์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ถ„๋ช…ํ•˜๊ณ  ์ •ํ™•ํ•œ ์–ธ์–ด๋กœ ๊น”๋”ํ•˜๊ฒŒ ๋งž์•„๋–จ์–ด์ ธ์•ผ ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด๊ฐ€๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Book/โœ Clean Code' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 6์žฅ ๊ฐ์ฒด์™€ ์ž๋ฃŒ ๊ตฌ์กฐ
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 5์žฅ ํ˜•์‹ ๋งž์ถ”๊ธฐ
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 4์žฅ ์ฃผ์„
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 1์žฅ ๊นจ๋—ํ•œ ์ฝ”๋“œ, 2์žฅ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Book] ํด๋ฆฐ์ฝ”๋“œ - 3์žฅ ํ•จ์ˆ˜
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”