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 ํ•„์š”.

Comments