Search
moon
sun
๐Ÿ“

OCP : The Open Closed Principle

Category
as S/W ์—”์ง€๋‹ˆ์–ด
Tags
S/W Engineering
Architecture
SOLID
OCP
Created time
2009/04/15

Definition

โ€ข
S/W ๊ฐœ์ฒด(class, module, function ๋“ฑ)๋Š” ํ™•์žฅ์— ์—ด๋ ค์žˆ๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ.
โ€ข
์ถ”์ƒํ™”๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ํŒŒ๊ธ‰์˜ ๊ฒฉ๋ฆฌ, ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•œ ํ™•์žฅ์˜ ์ง€์›

OCP violated sample

Class Client { void DoCommunicate(Server1 server1) { //.. } //... } //ํƒ€ server(Server2)๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์˜ ๋ณ€๊ฒฝ Class Client { void DoCommunicate(Server2 server2) { //.. } //... }
C#
๋ณต์‚ฌ
โ€ข
Client๋Š” Concrete class์ธ server๋ฅผ ์ฐธ์กฐ
โ€ข
๋งŒ์ผ client๊ฐ€ ํƒ€ server ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ƒˆ server ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒƒ์ž„

OCP complied sample

Class Server1 : IClient {} Class Client { void DoCommunicate(IClient server) { //.. } //... } //์ƒˆ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•  Server2. client ๋ณ€๊ฒฝ ํ•„์š” ๋ฌด Class Server2 : IClient {}
C#
๋ณต์‚ฌ
โ€ข
Client๋Š” ์ถ”์ƒ ํด๋ž˜์Šค ๋˜๋Š” interface๋ฅผ ์ฐธ์กฐ. ์ด ๋•Œ ์ฐธ์กฐํ•ด์•ผ ํ•  ์ƒˆ server ๊ฐœ์ฒด๊ฐ€ Client Interface๋ฅผ ์ƒ์†ํ•œ๋‹ค๋ฉด,
โ—ฆ
client๋Š” ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Œ(๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๊ฒฉ๋ฆฌ)
โ—ฆ
์ƒˆ server ๊ฐœ์ฒด๋ฅผ ํ†ตํ•ด client์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅ(๋‹คํ˜•์„ฑ ๊ธฐ๋ฐ˜)

Usage examples for OCP

โ€ข
Access modifier : ํŠนํžˆ private(protected), Property(Getter/Setter)๋ฅผ ํ†ตํ•œ ์™ธ๋ถ€ ๋…ธ์ถœ.
โ€ข
IOC(Inversion of Control) : template method, strategy pattern, delegate(C#) ๋“ฑ..

Conclusion

โ€ข
๊ฒฝ์ง์„ฑ๊ณผ ์ทจ์•ฝ์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๋Œ€ํ‘œ์  ์›์น™์œผ๋กœ์„œ, ๊ฐœ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ ํ•ต์‹ฌ.
โ€ข
OCP๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ ์ ˆํ•œ ์ถ”์ƒํ™”๋Š” ์‹ค์ œ ์ ์šฉ์—๋Š” ๋งŽ์€ ๊ฒฝํ—˜์„ ์š”๊ตฌ(์ ์šฉ์ด ์šฉ์ดํ•œ ์›์น™์€ ์•„๋‹˜) : ์™œ? ์ถ”์ƒํ™”๋Š” ์ข…์ข… '๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ'์„ ์œ ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์—. ์ ์ ˆํ•œ trade off ํ•„์š”.