๐ ๋ฆฌํฉํ ๋ง: ์กฐ๊ฑด๋ถ๋ฅผ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ
Switch ๋ฌธ์ ์ข ์ข ์ฝ๋ ๋์๋ก ๊ฐ์ฃผ๋๋ฏ๋ก ํผํด์ผ ํฉ๋๋ค.
๋ฌธ์
Bird
์ ๊ฐ์ ์์ฑ์ผ๋ก ์ ์๋ ๋ค์ํ ํ์ ์ ํ์ด ์๋ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.public class Bird
{
// whatever properties do birds have
public BirdType Type { get; set; }
}
public enum BirdType
{
African,
American,
European
}
๊ทธ๋ฐ ๋ค์ ์ฃผ์ด์ง ์์ ์๋๋ฅผ ๊ฒ์ํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๋ ์์ ์๋๊ฐ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋๋ค. ์ฝ๊ฐ์ ๋ ผ๋ฆฌ๊ฐ ํ์ํ์ง๋ง ์ถฉ๋ถํ ์ฝ๊ฒ ๋ค๋ฆฝ๋๊น? ํด๋์ค ๋ฉ์๋๋ฅผ ๋ง๋ญ๋๋ค.
public class Bird
{
// whatever properties do birds have
public BirdType Type { get; set; }
public double GetSpeed()
{
switch(Type)
{
case African:
// logic for African birds
case American:
// logic for American birds
case European:
// logic for European birds
default:
// default logic
}
}
}
์กฐ๊ธ ๋ชป์๊ฒผ์ง๋ง ์ ๋๋ก ์๋ํฉ๋๊น? ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์์ฐ์ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ์๋ก์ด ์ ํ์ ์๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
public enum BirdType
{
African,
American,
European,
Asian // new type
}
์ด์ ์๋๋ ๊ณ์ฐํด์ผ ํฉ๋๋ค. "
switch
๋ฌธ์ ๋ค๋ฅธ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ์ธ์"๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ์, ๊ทธ๋ ๊ฒ ํ ์ ์์ง๋ง ์ด๊ฒ์ SOLID์ ๊ฐ๋ฐฉํ ํ์ ์์น์ ์๋ฐํ๋ค๋ ์ ์ ๋ช
์ฌํ์ญ์์ค! ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ํ์ง ์์ต๋๋ค, ๊ทธ๋ ์ฃ ?ํด๊ฒฐ์ฑ : ๋คํ์ฑ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ์ฐ๋ฆฌ๋ ์์์ด๋ผ๋ ๊ฐ๋ ์ ๊ฐ๊ฒ ๋์๊ณ ์ด๋ฅผ ํตํด ๋คํ์ฑ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ต์ํ์ง ์์ ์ฌ๋๋ค์๊ฒ ๋คํ์ฑ์ด๋ ํด๋์ค์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ต์ํ ๊ฒ ๊ฐ๋์?
๋คํ์ฑ์ ์ผ๋์ ๋๊ณ ์์ ๋ฌธ์ ์ ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ํ ๊น์?
Bird
ํด๋์ค๋ฅผ ์ ์ํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ์์ํ์ง๋ง ํ ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค.public abstract class Bird
{
public abstract double GetSpeed();
}
์ด์
abstract
ํ์ ์๋ฅผ GetSpeed
๋ฉ์๋์ Bird
ํด๋์ค ์์ฒด์ ์ถ๊ฐํ์ต๋๋ค. ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ Bird
ํด๋์ค ์์ฒด์ ํด๋น ๋ฉ์๋์ ๋ํ ๊ตฌํ์ด ์๊ณ ์ง์ ์ธ์คํด์คํํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ํ์ ํด๋์ค์์ ์์ฒด์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ํ์ ํด๋์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์
๋๋ค!public class AfricanBird : Bird
{
public override double GetSpeed()
{
// logic for African birds
}
}
public class AmericanBird : Bird
{
public override double GetSpeed()
{
// logic for American birds
}
}
public class EuropeanBird : Bird
{
public override double GetSpeed()
{
// logic for European birds
}
}
์คํ ์ค์ธ ์ฝ๋์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
// Ran on C# Interactive via VisualStudio
> public abstract class Bird
. {
. public abstract double GetSpeed();
. }
> public class AfricanBird : Bird
. {
. public override double GetSpeed()
. {
. return 1;
. }
. }
> public class AmericanBird : Bird
. {
. public override double GetSpeed()
. {
. return 0.7;
. }
. }
> Bird africanBird = new AfricanBird();
> Bird americanBird = new AmericanBird();
> africanBird.GetSpeed()
1
> americanBird.GetSpeed()
0.7
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ฉ์๋๋
Bird
์ ์ํด ์ ์ธ๋์์ผ๋ฏ๋ก ๋ณ์๋ฅผ ๊ธฐ๋ณธ ํด๋์ค๋ก ์ ์ํ๊ณ ๊ณ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค ๐์๋ก์ด ์ ํ์ ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ ํ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค! ๊ธฐ์กด ํด๋์ค๋ฅผ ์์ ํ ํ์๊ฐ ์์ต๋๋ค! ์ฐ๋ฆฌ๋ ๊ฐ๋ฐฉ ํ์ ์์น์ ์กด์คํ์ต๋๋ค!
์ฐธ๊ณ : ์ํ๋ ์ด ๋ฆฌํฉํฐ๋ ๋คํ์ฑ์ผ๋ก ์กฐ๊ฑด๋ถ ๋ฐ๊พธ๊ธฐ(Replace conditional with Polymorphism)(์ด๋ฆ์ ๊ธฐ์ตํ๊ธฐ๊ฐ ์ฝ์ฃ ?)
์ด์ต
์ฐธ์กฐ
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ๋ฆฌํฉํ ๋ง: ์กฐ๊ฑด๋ถ๋ฅผ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/mundim/refactoring-replacing-conditional-with-polymorphism-2ob6ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค