๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“’ ๊ฐœ๋ฐœ ์„œ์ /Clean Code

[Clean Code] 6์žฅ ๊ฐ์ฒด์™€ ์ž๋ฃŒ๊ตฌ์กฐ

by nitronium102 2022. 3. 2.

TIL (Today I Learned)

22.03.01

 

์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„

6์žฅ. ๊ฐ์ฒด์™€ ์ž๋ฃŒ๊ตฌ์กฐ

 

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

์ž๋ฃŒ ์ถ”์ƒํ™”

๊ตฌํ˜„์„ ๊ฐ์ถ”๋ ค๋ฉด ์ถ”์ƒํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์กฐํšŒ ํ•จ์ˆ˜์™€ ์„ค์ • ํ•จ์ˆ˜๋กœ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃฌ๋‹ค๊ณ  ํด๋ž˜์Šค๊ฐ€ ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๋ณด๋‹ค๋Š” ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌํ˜„ใ…‡๋ฅด ๋ชจ๋ฅธ ์ฑ„ ์ž๋ฃŒ์˜ ํ•ต์‹ฌ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ํด๋ž˜์Šค๋‹ค. 

 

์ž๋ฃŒ/๊ฐ์ฒด ๋น„๋Œ€์นญ

๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ ์–ด๋ ค์šด ๋ณ€๊ฒฝ์€ ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ์—์„œ ์‰ฌ์šฐ๋ฉฐ,
์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ์—์„œ ์–ด๋ ค์šด ๋ณ€๊ฒฝ์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ ์‰ฝ๋‹ค!

1) ๊ฐ์ฒด : ๋™์ž‘์„ ๊ณต๊ฐœํ•˜๊ณ  ์ž๋ฃŒ๋ฅผ ์ˆจ๊ธด๋‹ค.

- ์žฅ์  : ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๋‹ค. 

- ๋‹จ์ : ๊ธฐ์กด ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

 

2) ์ž๋ฃŒ ๊ตฌ์กฐ(์ ˆ์ฐจ์ง€ํ–ฅ) : ๋ณ„๋‹ค๋ฅธ ๋™์ž‘ ์—†์ด ์ž๋ฃŒ/๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

- ์žฅ์  : ๊ธฐ์กด ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๋‹ค. 

- ๋‹จ์  : ๊ธฐ์กด ํ•จ์ˆ˜์— ์ƒˆ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. 

 

๐Ÿ“™ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘ ํ•œ ๊ฐ€์ง€๋งŒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

 

๋””๋ฏธํ„ฐ ๋ฒ•์น™

๋ชจ๋“ˆ์€ ์ž์‹ ์ด ์กฐ์ž‘ํ•˜๋Š” ๊ฐ์ฒด์˜ ์†์‚ฌ์ •์„ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค.

ํด๋ž˜์Šค C์˜ ๋ฉ”์„œ๋“œ f๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

1) ํด๋ž˜์Šค C

2) f๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด

3) f ์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ ๊ฐ์ฒด

4) C ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ์ฒด

 

๐Ÿ“™ ํ—ˆ์šฉ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. 

 

// ๊ธฐ์ฐจ ์ถฉ๋Œ
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

 

๊ตฌ์กฐ์ฒด ๊ฐ์ถ”๊ธฐ

๊ฐ์ฒด๋ผ๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถฐ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋ผ๊ณ  ๋งํ•ด์•ผ์ง€ ์†์„ ๋“œ๋Ÿฌ๋‚ด๋ผ๊ณ  ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. 

 

์ž๋ฃŒ ์ „๋‹ฌ ๊ฐ์ฒด(Data Transfer Object, DTO)

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

 

DTO์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋Š” bean ๊ตฌ์กฐ์ด๋ฉฐ, private ๋ณ€์ˆ˜๋ฅผ getter/setter ํ•จ์ˆ˜๋กœ ์กฐ์ž‘ํ•œ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ณ€์ˆ˜๋ฅผ ์บก์Šํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜์ด์ง€๋งŒ, ์‚ฌ์‹ค์ƒ ๋ณ„๋‹ค๋ฅธ ์ด์ต์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. 

 

ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ

DTO์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ. DTO์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ public ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ private ๋ณ€์ˆ˜์— getter/setter๊ฐ€ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ง€๋งŒ, save๋‚˜ find๊ฐ™์€ ํƒ์ƒ‰ ํ•จ์ˆ˜๋„ ์ œ๊ณตํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์ด๋‚˜ ๋‹ค๋ฅธ ์†Œ์Šค์—์„œ ์ž๋ฃŒ๋ฅผ ์ง์ ‘ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋‹ค.

-> ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.

 

์˜ค๋Š˜ ์ฝ์€ ์†Œ๊ฐ

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

 

๊ถ๊ธˆํ•˜๊ฑฐ๋‚˜ ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ๋‚ด์šฉ

Dual-Patch(Double Dispatch)

์ด๊ฑธ๋กœ ๊ฒ€์ƒ‰ํ•˜๋‹ˆ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚˜์™€์„œ double dispatch๋กœ ๊ฒ€์ƒ‰ํ–ˆ๋‹ค

- ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜๋ฅผ ๋‘ ๋ฒˆ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋Š” ์ž‘์—…. 

interface Post {
	void PostOn(SNS sns); // ํ•œ ๋ฒˆ
}

class Text implements Post {
	public void postOn(SNS sns) {
    	sns.post(this); // ๋‘ ๋ฒˆ
    }
}

https://wisdom-and-record.tistory.com/89

 

[Java] ๋”๋ธ” ๋””์ŠคํŒจ์น˜(Double Dispatch)

6์ฃผ์ฐจ ์Šคํ„ฐ๋””์—์„œ ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜์—๋Š” ๋™์  ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜์™€ ์ •์  ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜๋ฅผ ํ™œ์šฉํ•œ ๋”๋ธ” ๋””์ŠคํŒจ์น˜๋ผ๋Š” ๊ธฐ๋ฒ•์ด

wisdom-and-record.tistory.com

 

VISITOR ํŒจํ„ด

๋ฐฉ๋ฌธ์ž์™€ ๋ฐฉ๋ฌธ ๊ณต๊ฐ„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐฉ๋ฌธ ๊ณต๊ฐ„์ด ๋ฐฉ๋ฌธ์ž๋ฅผ ๋งž์ดํ•  ๋•Œ, ์ดํ›„์— ๋Œ€ํ•œ ํ–‰๋™์„ ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ํŒจํ„ด

- Visitor : Eliment๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

- ConcreteVisitor1, 2 : Visitor๋ฅผ ์ƒ์†๋ฐ›์•„ ์‹ค์ œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค

- Element : visitor๊ฐ€ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋Œ€์ƒ. ๊ตฌ์กฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

- ConcreteElementA, B : Element๋ฅผ ์ƒ์†๋ฐ›์•„ ์‹ค์ œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค

- ObjectStructure : Element๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค

 

๐Ÿ“™ ๋ฐ์ดํ„ฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๋…๋ฆฝ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.

 

https://dailyheumsi.tistory.com/216

 

[แ„ƒแ…ตแ„Œแ…กแ„‹แ…ตแ†ซ แ„‘แ…ขแ„แ…ฅแ†ซ 15แ„‘แ…งแ†ซ] ํ–‰๋™ ํŒจํ„ด, ๋ฐฉ๋ฌธ์ž (Visitor)

1. ๊ฐœ๋… ๋น„์ง€ํ„ฐ ํŒจํ„ด์€ ๋ฐฉ๋ฌธ์ž์™€ ๋ฐฉ๋ฌธ ๊ณต๊ฐ„์„ ๋ถ„๋ฆฌํ•˜์—ฌ, ๋ฐฉ๋ฌธ ๊ณต๊ฐ„์ด ๋ฐฉ๋ฌธ์ž๋ฅผ ๋งž์ดํ•  ๋•Œ, ์ดํ›„์— ๋Œ€ํ•œ ํ–‰๋™์„ ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์ฐธ ์–ด๋ ค์šด ํŒจํ„ด์ด๋‹ค. ๋ณดํ†ต OOP์—

dailyheumsi.tistory.com

 

ํœด๋ฆฌ์Šคํ‹ฑ(heuristic)

์‹œ๊ฐ„์ด๋‚˜ ์ •๋ณด๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•„ ํ•ฉ๋ฆฌ์ ์ธ ํŒ๋‹จ์„ ํ•  ์ˆ˜ ์—†์„ ๋•Œ, ํ˜น์€ ๊ตณ์ด ํ•ฉ๋ฆฌ์  ํŒ๋‹จ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ ์‚ฌ๋žŒ๋“ค์ด ์‹ ์†ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋ฆผ ์ง์ž‘

 

ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ

๊ฒ€์ƒ‰ํ•ด๋„ ์•ˆ ๋‚˜์™€์„œ ๋ญ”๊ฐ€ ํ–ˆ๋”๋‹ˆ Rails์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์ด์—ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ์ฐธ๊ณ 

http://guruble.com/activerecord%EB%8A%94-%EC%99%9C-active-record%EC%9D%B8%EA%B0%80/

 

ActiveRecord๋Š” ์™œ active record์ธ๊ฐ€?

Rails ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” MVC ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ M(model)์œผ๋กœ์„œ ActiveRecord๋ฅผ ์ด์šฉํ•œ๋‹ค. ActiveRecord๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์— ์˜์†์ ์œผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜์—ฌ ์‚ฌ์šฉํ•˜

guruble.com

 

๋Œ“๊ธ€