-
Notifications
You must be signed in to change notification settings - Fork 0
cplusplus_coding_techniques
Kyusung, Hwang edited this page Oct 3, 2019
·
1 revision
-
์ฝ๋ฉ์ ๊ธฐ์
- ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๊ธฐ๋ณธ
-
๊ฐ์ฒด์งํฅ ์ค๊ณ์ ์์น
- ๋จ์ผ ์ฑ ์์ ์์น (SRP, Single Responsibility Principle)
- ๊ฐ๋ฐฉ ํ์ ์์น (OCP, Open-Closed Principle)
- ๋ฆฌ์ค์ฝํ ์นํ ์์น (LSB, Liskov Substitution Principle)
- ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (ISP, Interfcae Segregation Principle)
- ์์กด ๊ด๊ณ ์ญ์ ์์น (DIP, Dependency Inversion Principle)
- ๋ฐ๋ฉํ ๋ฅด ๋ฒ์น
- ๋์์ธ ํจํด
- ํด๋์ค ์ค๊ณ ์๋ น
- getter ์ setter ๋ฅผ ๋๋๋ก ์ฌ์ฉํ์ง ๋ง๊ฒ.
- ๋ถ๋ชจ ์์ ๊ด๊ณ๋ผ๋ private ์ ์ฌ์ฉํ์.
// bad
Vector2 postion = player.getPosition();
position += player.getVelocity();
player.setPosition(position);
// good
// '์ง์ ํ์ง ๋ง๊ณ ๋ช
๋ นํ๋ผ'
player.move();- ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๋ ์ต์ํ์ผ๋ก ๋ง๋ค์.
// bad
class Game {
private:
int score;
float timer;
list<Actor*> actors;
};
// good
// ํด๋์ค ๋ฉค๋ฒ ๋ณ์๊ฐ 1๊ฐ๋ผ๋ฉด ํ๋์ ์ญํ ์ ์ง์คํ ์ ์๋ค.
class Score {
private:
int score;
}
class Timer {
private:
float time;
}
class ActorManager {
private:
list<Actor*> actors;
}
class Game {
private:
Score score;
Timer timer;
ActorManager actors;
}- ๊ฒฐํฉ๋๋ฅผ ๋ฎ๊ฒ ์ค๊ณํ์.
- ๋จ์ ํ ์คํธ๊ฐ ์ด๋ ต๋ค๋ฉด ๊ฒฐํฉ๋๊ฐ ๋์ ๊ฒ.
- ์์๋ณด๋ค๋ ์ด์์ ์ฐ์ ํด์ ์ค๊ณํ์.
// bad
class Robot {
public:
void update() {
move();
}
private:
virtual void move() = 0;
}
class CleanerRobot : public Robot {
private:
virtual void move() ovveride {}
}
class CombatRobot : public Robot {
private:
virtual void move() override {}
}
// good
class Robot {
public:
Robot(RobotBehavior* behavior) : _behavior(behavior) {}
~Robot() {
delete _behavior;
}
void update() {
_behavior->move();
}
private:
RobotBehavior* _behavior;
}
class CleanerBehavior : public RobotBehavior {
public:
virtual void move() override {}
}
class CombatBehavior: public RobotBehavior {
public:
virtual void move() override {}
}
// usage
Robot cleanerRobot(new CleanerBehavior());
Robot combatRobot(new CombatBehavior());- ์์ ๊ด๊ณ์์ ์คํ์ค ๋ณ๊ฒฝ์ด ์ด๋ ต๊ณ , ์ด์์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค.
cleaner.Robot.changeBehavior(new CombatBehavior());- ๋ค๋ฅธ ์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค๋๋ ์ฌ์ฌ์ฉํ ์ ์๋ค.
SuperRobot superRobot(new CombatBehavior());- ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
- ์ํํธ์จ์ด ๊ตฌ์ฑ ์์๋ ํ์ฅ์ ๊ดํด์๋ ์ด๋ ค์์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์ ๋ํด์๋ ๋ซํ์์ด์ผ ํ๋ค.
- ๋ณํํ์ง ์๋ ๋ถ๋ถ๊ณผ ์ด๋ฆฐ ๋ถ๋ถ์ ๋ถ๋ฆฌํ์.
- ์ถ์ ํด๋์ค (๋ซํ ๋ถ๋ถ), ๊ตฌํ ํด๋์ค (์ด๋ฆฐ ๋ถ๋ถ)
- ํ์ ์๋ฃํ์ ๊ธฐ๋ณธ ์๋ฃํ๊ณผ ์นํํ ์ ์์ด์ผ ํ๋ค.
- ๋ถ๋ชจ ํด๋์ค๋ก ์นํํ ์ํ์์๋ ์ ์ ์๋ํด์ผ ํ๋ค.
- ๊น์ ์์๊ด๊ณ๋ฅผ ๋ง๋ค์ง ๋ง๊ณ , ์์์ ์ฐ์ ํ์.
- ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ์ง ์๋ ๋ฉค๋ฒ ํจ์์ ์์กด์ ํด๋ผ์ด์ธํธ์ ๊ฐ์ํ๋ฉด ์๋๋ค.
- ํด๋์ค ์ฌ์ฉ์์๊ฒ ๋ถํ์ํ ์ธํฐํ์ด์ค๋ ๊ณต๊ฐํ์ง ๋ง๋ผ.
- ๋ค์์ ๋ฉค๋ฒ ํจ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ํ์ํ ๋ฉค๋ฒ ํจ์๋ง์ผ๋ก ํ์ ํ ์ ์ฉ ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด๊ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค.
- ์์ ๋ชจ๋์ ํ์ ๋ชจ๋์ ์์กดํ์ง ์๋๋ค, ๋ ๋ชจ๋ ๋ชจ๋ ๋ณ๋์ ์ถ์ํ ๋๊ฒ์ ์์กดํ๋ค.
- ๊ตฌ์ฒด์ ์ธ๊ฒ์ด ์๋ ์ถ์์ ์ธ๊ฒ์ ์์กดํ์.
- ์ต์ ์ง์์ ์์น, ์ง์ ์ ์ธ ์น๊ตฌ์๋ง ๊ด๋ จํ๋ค.
// bad
Player* player = world_.getManager().find("player");
// good
Player* palyer = world.find("Player");- ๋ถ๋ชจ ํด๋์ค์ ์ ํํํ ์ฒ๋ฆฌ ๊ณผ์ ์ ์ ์ํ๊ณ , ์ฒ๋ฆฌ๊ฐ ๋ค๋ฅธ ๋ถ๋ถ์ ์์ ํด๋์ค๋ก ๊ตฌํํ๋ ํจํด
- ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ ๋ฑ์ ์์ฃผ ์ฌ์ฉ๋จ
- ์์์ ์ฌ์ฌ์ฉํ ๊ณ ์ ์ ์ธ ํจํด.
- ์๊ณ ๋ฆฌ์ฆ์ด ๋ณํ(์ ๋ต)ํ๋ ๋ถ๋ถ์ ํด๋์คํํด์ ๊ตํํ ์ ์๊ฒ ํ๋ ํจํด
- switch ์กฐ๊ฑด๋ฌธ์ด ๋์ค๋ฉด Strategy ํจํด์ผ๋ก ํด๊ฒฐํ ์ ์๋์ง ์ดํด๋ณผ ๊ฒ
- Strategy ํจํด์ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ๊ตฌํ ๋ถ๋ถ์ ๊ตํํ๋ ๊ณ ์ ์ ์ธ ํจํด
- ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ ์ฌ๋ฌ๊ฐ์ง ์ํ๋ฅผ ํด๋์คํํ๋ ํจํด
- Strategy ํจํด๊ณผ ๊ตฌํ๋ฐฉ๋ฒ์ด ๊ฑฐ์ ๋น์ทํ์ง๋ง, ์ฌ์ฉํ๋ ์ํฉ์ด ๋ค๋ฅด๋ค.
- ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ฌ๊ท์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ํจํด
- ๊ฒ์ ์์ง์ ๊ฒ์ ๊ฐ์ฒด ๊ด๋ฆฌ ๋ฑ์ ์์ฃผ ์ฌ์ฉ๋จ.
- ์ปจํ ์ด๋ ํด๋์ค ๋ด๋ถ ์์์ ์์๋๋ก ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- ์๋ฃ๊ตฌ์กฐ์ ๊ตฌํ ์์ธ๋ฅผ ์บก์ํ
- ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ํต์งํด์ฃผ๋ ํจํด
- ๊ฐ์ฒด ์ธ์คํด์คํ๋ฅผ 1 ๊ฐ๋ก ์ ํํ๊ณ , ์ ์ญ์์ ์ ๊ทผํ ์ ์๊ฒ ํ๋ ํจํด
- ํด๋์ค ์ค๊ณ๋ ํ์ค ์ธ๊ณ์ ์ ๋ฌด ๋ถ๋ด๊ณผ ๋น์ท
- ๊ฐ ํด๋์ค์ ์ญํ ์ ์ ํ๊ณ , ์ ๋ฌด ์ฑ ์์ ๋ถ๋ดํ๋ ์์
- ํด๋์ค ์ฌ์ฉ ๊ด์ ์์๋ ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ๋ณด๋ค๋ ์ด๋ค ์ญํ ๊ณผ ์ฑ ์์ด ์๋์ง๊ฐ ์ค์ํจ.
- ์์ ๊ณผ ๊ด๋ฆฌ, ์ค์ฌ, ์ฐฝ๊ตฌ, ์์ฑ, ์ ์ฉ๊ณผ ๋ฒ์ฉ
-
์์ ๊ณผ ์ญํ ํด๋์ค์ ๊ด๋ฆฌ ํด๋์ค
- ์์ ์ญํ ํด๋์ค๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์, ๊ด๋ฆฌ ์ญํ ํด๋์ค๋ ์์ ์ญํ ํด๋์ค๋ฅผ ์ ์ด
- ๊ฐ์์ด๋ -> ๊ด๋ฆฌ์ - ์ค๊ณ์/ํ๋ก๊ทธ๋๋จธ/๋์์ด๋
- 1 ๊ฐ์ ํด๋์ค์ ๋๋ฌด ๋ง์ ์ผ์ ์ฃผ์ง ๋ง๊ฒ.
-
์ค์ฌ ์ญํ ํด๋์ค
- ๊ฐ์ฒด๋ค์ ์กฐ์ ์ ๋ด๋น
- Mediator ํจํด์ ํด๋นํจ
- ์ค์ฌ์๋ฅผ ์ฌ์ฉํด ์์กด ๊ด๊ณ๋ฅผ ๋จ์ํ ํ์.
-
์ฐฝ๊ตฌ ์ญํ ํด๋์ค
- ์์ ์ ์๋ขฐ๋ฐ๊ณ ์ค์ง์ ์ธ ์์ ์ ๋ค๋ฅธ ํด๋์ค์ ์ ๋ฌํ๋ ์ญํ
- Facade ํจํด์ ํด๋น
- ์ธ๋ถ์์ ์ธํฐํ์ด์ค ๋ถ๋ถ์ ํด๋์คํ ํ์.
-
์์ฑ ์ญํ ํด๋์ค
- ๊ฐ์ฒด ์์ฑ์ ์ํํ๋ ๊ณต์ฅ๊ณผ ๊ฐ์ ํด๋์ค
- ๊ฐ์ฒด์ ๋ณ๊ฒฝ ๋๋ ์์ ์ด ๊ฐ๋จํด์ง๊ณ ์ฐ๊ด์ ์ค์ผ ์ ์๋ค.
- Abstract Factory ํจํด
-
์ ์ฉํด๋์ค์ ๋ฒ์ฉ ํด๋์ค
- ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ง ์ฌ์ฉํ๋ ์ ์ฉ ํด๋์ค์ ์ฌ์ฌ์ฉ์ ๋ชฉ์ ์ผ๋ก ํ๋ ๋ฒ์ฉ ํด๋์ค๋ฅผ ๊ตฌ๋ณํด์ ์ค๊ณํ์.
- ๋ช ํํ ์ญํ ๊ณผ ์ฑ ์์ ๊ฐ๊ฒ ํ๋๊ฒ ์ค์ํ๋ค.
- ์ฌ์ฉ์ ์ธก์ ์ฝ๋๊ฐ ๊ฐ๋จํด์ง ์ ์๋๋ก ๋ด๋น ํด๋์ค์ ์ ๋๋ก ์ด์ํ์.
- ์ถ์๋๊ฐ ๋์ผ๋ฉด ์ฝ๋๊ฐ ๋จ์ํด์ ธ์ ์์ ๋๋ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ค.
- '๋ฌธ์ ์ ๋ณธ์ง'์ ํ์ ํด์ ์ถ์๋๋ฅผ ๋์ด์.
- ํด๋์ค ์ฌ์ฉ์์ธก์ด ์์ ์์๋ถํฐ ํ๋ค์ด(top-down) ํด์ ์๊ฐํ๋ฉด ์ถ์๋ ๋์ ํด๋์ค๋ฅผ ์ค๊ณํ ์ ์๋ค.
- ์ถ์๋ ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ด๋ป๊ฒ ์์ฑํ ์ง ์๊ฐํด๋ณด์.
- ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ์๊ฒฐํฉ์ผ๋ก ์ ๋ํ์.
- ํด๋์ค ๊ณตํตํ: ๋ถ๋ชจ ํด๋์ค ๋๋ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํด ํด๋์ค๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ
- ๊ตฌํ ์๋จ ๊ตํ: Strategy ํจํด
- ๋ณํํ๊ธฐ ์ฌ์ด ๋ถ๋ถ ๋ถ๋ฆฌ: ๊ฐ๋ฐฉ/ํ์ ์์น
- ๋ถ์ ์ ํ ๊ฒฐํฉ ๊ด๊ณ ๋ถ๋ฆฌ: ์ค์ฌ ์ญํ ๋๋ ์ฐฝ๊ตฌ ์ญํ ๋ด๋น, ์ง์ ๊ฒฐํฉ์ ๋ถ๋ฆฌํด์ ์๊ฒฐํฉ์ผ๋ก ๋ง๋ฆ
- ํจํค๊ธฐ ๊ฒฝ๊ณ ๋ถ๋ฆฌ: ํจํค์ง๋ฅผ ๋ ๋ฆฝ์ํค๊ณ ์ธ๋ถ ๋ณ๊ฒฝ์ ์ํฅ์ ํผํ ๋, ์์กด๊ด๊ณ ์ญ์ ์ ๋ฒ์น
- ๊ฐ์ฒด๋ ์์ฑ์๊ฐ ํธ์ถ๋ ์์ ์ ์์ ํ ์ํ๋ฅผ ์์ฑํด์ผ ํ๋ค.
- ํธ์ถ ์์์ ์ ํ์ด ์๋ ํด๋์ค๋ ์ฌ์ฉ์์๊ฒ ๋ถ๋ด๋๊ณ , ๋ฒ๊ทธ์ ์์ธ์ด ๋๋ค
- ํธ์ถ ์์์ ์ ์ฝ์ด ์๋ ํด๋์ค๋, ์ ์ด ์ญํ ์ ํ๋ ํด๋์ค์ ํจ๊ป ์กฐํฉํด์ ์ฌ์ฉ
// bad!
// ์ฌ์ฉ์ ์
์ฅ์์๋ flag ์์ ํ๋๊ฒ์ ์ํ์๊ฐ ์๋ค.
// ๋ฉค๋ฒํจ์ ์ด๋ฆ์ด ๋ฐ๋๋ฉด ์ฌ์ฉ์์ธก ์ฝ๋๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
bool getDeadFlag() {
return isDead;
}
// good!
bool isDead() {
return isDead;
}