๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์ /ํด๋ฆฐ ์ฝ”๋“œ

ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) - 8์žฅ, 9์žฅ

Amenable 2023. 1. 10. 22:36

8์žฅ. ๊ฒฝ๊ณ„ ๐Ÿ’’

  ์‹œ์Šคํ…œ์— ๋“ค์–ด๊ฐ€๋Š” ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค. ๋•Œ๋กœ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ๊ณ , ๋•Œ๋กœ๋Š” ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋•Œ๋กœ๋Š” ์‚ฌ๋‚ด ๋‹ค๋ฅธ ํŒ€์ด ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ด ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ ์ฝ”๋“œ์— ๊น”๋”ํ•˜๊ฒŒ ํ†ตํ•ฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ์ด ์žฅ์—์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฒฝ๊ณ„๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•๊ณผ ๊ธฐ๊ต๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

 

  • Map์„ (ํ˜น์€ ์œ ์‚ฌํ•œ ๊ฒฝ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ) ์—ฌ๊ธฐ์ €๊ธฐ ๋„˜๊ธฐ์ง€ ๋ง๋ผ.
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);

  ์œ„์˜ ์ฝ”๋“œ๋Š” ์˜๋„๊ฐ€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š” ๊นจ๋—ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์ด๋‹ค. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ œ๋„ค๋ฆญ์Šค(Generics)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ๋†’์•„์ง€์ง€๋งŒ Map<String, Sensor>๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ๊นŒ์ง€ ์ œ๊ณตํ•œ๋‹ค.

Map<String, Sensor> sensors = new HashMap<Sensor>();
...
Sensor s = sensors.get(sensorId);

  ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฒฝ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค์ธ Map์„ Sensors ์•ˆ์œผ๋กœ ์ˆจ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ Map ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€ํ•˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ Sensors ํด๋ž˜์Šค๋Š” ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋Š” ์ดํ•ดํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ ์˜ค์šฉํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

public class Sensors {
    private Map sensors = new HashMap();
    
    public Sensor getById(String id) {
        return (Sensor) sensors.get(id);
    }
    ...
}

 

8์žฅ ๊ฒฐ๋ก 

  ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ์ค„์—ฌ ๊ฒฝ๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜์ž. ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋กœ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ADAPTER ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํŒจํ‚ค์ง€๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜์ž. ์–ด๋А ๋ฐฉ๋ฒ•์ด๋“  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๋ฉฐ, ๊ฒฝ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๊ด€์„ฑ๋„ ๋†’์•„์ง€๋ฉฐ, ์™ธ๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ๋ณ€ํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝํ•  ์ฝ”๋“œ๋„ ์ค„์–ด๋“ ๋‹ค.

 

9์žฅ. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๐Ÿซ

  • ํ…Œ์ŠคํŠธ๋Š” ์œ ์—ฐ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
      ์ฝ”๋“œ์— ์œ ์—ฐ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฒ„ํŒ€๋ชฉ์ด ๋ฐ”๋กœ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—†๋‹ค๋ฉด ๋ชจ๋“  ๋ณ€๊ฒฝ์ด ์ž ์ •์ ์ธ ๋ฒ„๊ทธ๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ์ด ์‰ฌ์›Œ์ง„๋‹ค. 
      ๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋Šฅ๋ ฅ์ด ๋–จ์–ด์ง€๋ฉฐ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋Šฅ๋ ฅ๋„ ๋–จ์–ด์ง„๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ• ์ˆ˜๋ก ์‹ค์ œ ์ฝ”๋“œ๋„ ์ง€์ €๋ถ„ํ•ด์ง„๋‹ค. ๊ฒฐ๊ตญ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๊ณ  ์‹ค์ œ ์ฝ”๋“œ๋„ ๋ง๊ฐ€์ง„๋‹ค.
  • ๊ฐ€๋…์„ฑ, ๊ฐ€๋…์„ฑ, ๊ฐ€๋…์„ฑ
      ๊นจ๋—ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์„ธ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ฐ€๋…์„ฑ, ๊ฐ€๋…์„ฑ, ๊ฐ€๋…์„ฑ. ์–ด์ฉŒ๋ฉด ๊ฐ€๋…์„ฑ์€ ์‹ค์ œ ์ฝ”๋“œ๋ณด๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋”๋”์šฑ ์ค‘์š”ํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ช…๋ฃŒ์„ฑ, ๋‹จ์ˆœ์„ฑ, ํ’๋ถ€ํ•œ ํ‘œํ˜„๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ตœ์†Œ์˜ ํ‘œํ˜„์œผ๋กœ ๋งŽ์€ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.
      ์ฒซ ๋ถ€๋ถ„์€ ํ…Œ์ŠคํŠธ ์ž๋ฃŒ๋ฅผ ๋งŒ๋“ ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ํ…Œ์ŠคํŠธ ์ž๋ฃŒ๋ฅผ ์กฐ์ž‘ํ•˜๋ฉฐ, ์„ธ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์กฐ์ž‘ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•œ๋‹ค.
  • ๊ฐœ๋… ๋‹น assert ๋ฌธ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ค„์—ฌ๋ผ
      ๋งŒ์•ฝ assert ๋ฌธ์ด ๋‹จ ํ•˜๋‚˜์ธ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•จ์ˆ˜๋Š” ๊ฒฐ๋ก ์ด ํ•˜๋‚˜๋ผ์„œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๋น ๋ฅด๋‹ค.
  • ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ํ•˜๋‚˜๋Š” ๊ฐœ๋… ํ•˜๋‚˜๋งŒ ํ…Œ์ŠคํŠธํ•˜๋ผ
  • F.I.R.S.T
      ๊นจ๋—ํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.
    ๋น ๋ฅด๊ฒŒ(Fast)
      ํ…Œ์ŠคํŠธ๋Š” ๋นจ๋ผ์•ผ ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ๋นจ๋ฆฌ ๋Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋А๋ฆฌ๋ฉด ์ž์ฃผ ๋Œ๋ฆด ์—„๋‘๋ฅผ ๋ชป ๋‚ธ๋‹ค. ์ž์ฃผ ๋Œ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ์ดˆ๋ฐ˜์— ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ด ๊ณ ์น˜์ง€ ๋ชปํ•œ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋งˆ์Œ๊ป ์ •๋ฆฌํ•˜์ง€๋„ ๋ชปํ•œ๋‹ค. ๊ฒฐ๊ตญ ์ฝ”๋“œ ํ’ˆ์งˆ์ด ๋ง๊ฐ€์ง€๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.
    ๋…๋ฆฝ์ ์œผ๋กœ(Independent)
      ๊ฐ ํ…Œ์ŠคํŠธ๋Š” ์„œ๋กœ ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋  ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ˆœ์„œ๋„ ์‹คํ–‰ํ•ด๋„ ๊ดœ์ฐฎ์•„์•ผ ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์„œ๋กœ์—๊ฒŒ ์˜์กดํ•˜๋ฉด ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•  ๋•Œ ๋‚˜๋จธ์ง€๋„ ์ž‡๋‹ฌ์•„ ์‹คํŒจํ•˜๋ฏ€๋กœ ์›์ธ์„ ์ง„๋‹จํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋ฉฐ ํ›„๋ฐ˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์ฐพ์•„๋‚ด์•ผ ํ•  ๊ฒฐํ•จ์ด ์ˆจ๊ฒจ์ง„๋‹ค.
    ๋ฐ˜๋ณต๊ฐ€๋Šฅํ•˜๊ฒŒ(Repeatable)
      ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ์‹ค์ œ ํ™˜๊ฒฝ, QA ํ™˜๊ฒฝ, ๋ฒ„์Šค๋ฅผ ํƒ€๊ณ  ์ง‘์œผ๋กœ ๊ฐ€๋Š” ๊ธธ์— ์‚ฌ์šฉํ•˜๋Š” (๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€) ๋…ธํŠธ๋ถ ํ™˜๊ฒฝ์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š” ํ™˜๊ฒฝ์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•œ ์ด์œ ๋ฅผ ๋‘˜๋Ÿฌ๋‚ผ ๋ณ€๋ช…์ด ์ƒ๊ธด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํ™˜๊ฒฝ์ด ์ง€์›๋˜์ง€ ์•Š๊ธฐ์— ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์— ์ง๋ฉดํ•œ๋‹ค.
    ์ž๊ฐ€๊ฒ€์ฆํ•˜๋Š”(Self_Validating)
      ํ…Œ์ŠคํŠธ๋Š” boolean ๊ฐ’์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์•ผ ํ•œ๋‹ค. ์„ฑ๊ณต ์•„๋‹ˆ๋ฉด ์‹คํŒจ๋‹ค. ํ†ต๊ณผ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค๊ณ  ๋กœ๊ทธ ํŒŒ์ผ์„ ์ฝ๊ฒŒ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ํ†ต๊ณผ ์—ฌ๋ถ€๋ฅผ ๋ณด๋ ค๊ณ  ํ…์ŠคํŠธ ํŒŒ์ผ ๋‘ ๊ฐœ๋ฅผ ์ˆ˜์ž‘์—…์œผ๋กœ ๋น„๊ตํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ๋„ ์•ˆ ๋œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์Šค์Šค๋กœ ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฐ€๋Š ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํŒ๋‹จ์€ ์ฃผ๊ด€์ ์ด ๋˜๋ฉฐ ์ง€๋ฃจํ•œ ์ˆ˜์ž‘์—… ํ‰๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค.
    ์ ์‹œ์—(Timely)
      ํ…Œ์ŠคํŠธ๋Š” ์ ์‹œ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ง์ „์— ๊ตฌํ˜„ํ•œ๋‹ค. ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ์–ด๋–ค ์‹ค์ œ ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๊ณ  ํŒ๋ช… ๋‚ ์ง€ ๋ชจ๋ฅธ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

9์žฅ ๊ฒฐ๋ก 

  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฐฉ์น˜๋˜์–ด ๋ง๊ฐ€์ง€๋ฉด ์‹ค์ œ ์ฝ”๋“œ๋„ ๋ง๊ฐ€์ง„๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜์ž.

 

 

๋Œ“๊ธ€์ˆ˜0