๊ฐ์ฒด์งํฅ ์ํ ์ฒด์กฐ 9์์น
'์ํธ์ ์ค ์ค์๋ฌ์ง'๋ผ๋ ์ฑ ์์๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ณด๋ค ์ ํ๊ธฐ ์ํด์ 9๊ฐ์ง ์์น์ ์ ์ํ๋ค. ์ง๊ธ๊น์ง ๊ณต๋ถํ๊ณ , ์ง์ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๊ฐ ๊ท์น์ ์ ์จ์ผ ํ๊ณ ๋ฌด์์ด ์ข์ ์ง ์์ฑํด๋ณด๊ณ ์ ํ๋ค.
๊ท์น 1. ํ ๋ฉ์๋์ ํ ๋จ๊ณ์ ๋ค์ฌ์ฐ๊ธฐ(indent)๋ง ํ๋ค.
์ง๊ธ๊น์ง ์ฝ๋ฉํ ์คํธ๋ฅผ ํฌํจํ์ฌ ์ฝ๋๋ฅผ ์งค ๋, ๋ค์ฌ์ฐ๊ธฐ ๋ฐ์ ์ ๊ฒฝ์ฐ์ง ์์๋ค. ๋จ์ด ๋ณผ ์ฝ๋๋ผ๊ณ ๋ ์ ํ ์๊ฐํ์ง ์์์์๋ค. ํ์ง๋ง, ํ์ ์ ํผ์์ ํ๋ ๊ฒ์ด ์๋๋ค. ๋๊ฐ ๋ณด์๋ ์์๋ณผ ์ ์๋ ์ฝ๋์ฌ์ผ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ด์ ์ด ํฌ๋ค.
๊น์ ๋ค์ฌ์ฐ๊ธฐ๋ ๊ฐ๋ ์ฑ์ ์ข์ง ๋ชปํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ ์ด๋ฉด ์ค์ด๋ ๊ฒ์ด ์ข๋ค. ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฒ์ ๊ฐ๋ ์ฑ ๋ฟ๋ง์ด ์๋๋ผ, ์ฌ์ฌ์ฉ์ฑ๊ณผ ๋๋ฒ๊น ์ ์์ด์๋ ์ ๋ฆฌํ๋ค.
ํจ์๋ ํ ๊ฐ์ง ์ผ์ ํด์ผํ๋ฉฐ, ํ ๊ฐ์ง ์ผ์ ์ํด์ผ ํ๋ค. ๋ํ ๊ทธ ํ ๊ฐ์ง๋ง์ ํด์ผํ๋ค.(- Clean Code) ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๊น๋ค๋ ๊ฒ์ ํจ์๊ฐ ํ ๊ฐ์ง ์ผ์ ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ์ง์ํ๋ ๊ฒ์ด ์ข๋ค.
private void distributeCardsToPlayers() {
OutputView.showDividePlayerCards(dealer.getDealerInfo(), players.getPlayersInfo());
getPlayers().forEach(this::distributeCardsToPlayer);
}
private void distributeCardsToPlayer(Player player) {
while (InputView.getCardCondition(player.getPlayerInfo().getPlayerName())) {
player.pickCard(deck);
OutputView.showPlayerCard(player.getPlayerInfo());
}
OutputView.showPlayerCard(player.getPlayerInfo());
}
ํน์ฌ๋ ๊น์ด๊ฐ ๊น์ด์ง๋๋ผ๋, ํจ์๋ฅผ ํตํด ์ผ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์. ์์ ๋งํ๋ฏ์ด ํ๋์ ํจ์๊ฐ ํ ๊ฐ์ง์ ์ผ์ ํ๋๋ก ํ๋ค๋ฉด ์ธ๋ดํธ๊ฐ ๋์ด๋๋ ์ผ์ ์ค์ด๋ค ๊ฒ์ด๋ค.
๊ท์น 2. else ์์ฝ์ด๋ฅผ ์ฐ์ง ์๋๋ค.
์ง๊ธ๊น์ง ์ฝ๋์์ ์์ ์ฌํญ์ด ๋ฐ์ํ๋ฉด else ์์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ ์ ์ด ๋ง๋ค. ๊ทธ๋ฌ๋, else ์์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ํ๋ฆ์ด ๋น์ ํ์ ์ผ๋ก ๋ณํ๋ค. ์ด๋ ์ธ๊ฐ์ด ๋ณด๊ธฐ์ ์ง๊ด์ ์ด์ง ๋ชปํ๋ฉฐ ํด์์ ์ด๋ ค์์ ๊ฒช์ ์ ์๋ค.
public String getGrade(int score) {
if (score >= 90) {
return "A";
} else {
if (score >= 80) {
return "B";
} else {
return "C";
}
}
}
์์ ๊ฐ์ ์ฝ๋๊ฐ ๊ทธ ์ฌ๋ก์ด๋ค. ๋จ์ํ ์ฑ์ ๋ฑ๊ธ์ ์ฐพ๊ธฐ์ํ ํจ์์ผ ๋ฟ์ธ๋ฐ, else๋ฌธ์ ๋จ๋ฐํ๋ฉด ์ข๊ฒ ๋ณด๊ธฐ ํ๋ค๋ค. ์ด๋ฅผ Arrow-Anti-Pattern์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์กฐ๊ฑด๋ฌธ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ํฉ์์ ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ ๊น? ๋ฐ๋ก Early Return ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ด๋ ๋ง์ฝ ์กฐ๊ฑด๋ฌธ์ ๋ถํฉํ๋ค๋ฉด ๊ทธ ์ฆ์ ๋ฆฌํดํ๋ ํจํด์ ๋งํ๋ค.
์์ ๊ฐ์ ์ํฉ์์๋ ์๋์ ๊ฐ์ด Early Return ํจํด์ ์ ์ฉ์ํฌ ์ ์๋ค.
public String getGrade(int score) {
if (score >= 90) {
return "A";
if (score >= 80) {
return "B";
}
if (score >= 70) {
return "C";
}
}
๊ท์น 3. ๋ชจ๋ ์์๊ฐ๊ณผ ๋ฌธ์์ด์ ํฌ์ฅํ๋ค.
์์๊ฐ, ์ฆ _primitive_ ํ์ ์ ๊ทธ ์์ฒด๋ก ์๋ฏธ๋ฅผ ์ง๋๊ณ ์์ง ์๋ค. _int_๋ ๊ทธ์ ์ซ์๋ฅผ ๋ํ๋ผ ๋ฟ์ด๊ณ , _char_๋ ๋จ์ง ๋ฌธ์๋ฅผ ๋ํ๋ผ ๋ฟ์ด๋ค. ํด๋์ค๋ ์ด๋ ๊ฒ ์๋ฏธ์๋ _primitive_ ํ์ ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์ ํธํ์ง ์๋๋ค. ํนํ๋ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์ค๋ ๋๋ ๋๋์ฑ ๊ทธ๋ ๋ค.
์๋ฅผ๋ค์ด, ์๋์ ๊ฐ์ class๊ฐ ์๋ค๊ณ ํด๋ณด์.
public class Card {
private String cardSuit;
private String cardRank;
public Card(String cardSuit, String cardRank) {
this.cardSuit = cardSuit;
this.cardRank = cardRank;
}
public String getCardRank() {
return cardRank();
}
public String getCardSuit() {
return cardSuit();
}
}
์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก _String_ํ์ ์ _cardSuit_๊ณผ _cardRank_๋ฅผ ๋ฐ๋๋ค. ์ด๋, ์๋กญ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํด๋ณด์.
Card card = new Card("3", "spade");
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, ์๋ํ ๋ฐ์ ๋ฐ๋ฅด๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๊น? ๊ทธ๋ ์ง ์๋ค. ํด๋์ค์์๋ ๋ถ๋ช ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์นด๋์ ์ซ์๋ฅผ ์ํ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ก ์นด๋์ ๋ชจ์์ ์ํ๋ค. ํ์ง๋ง, ์์ฑ๋๋ ๊ฐ์ฒด๋ ์นด๋์ ์ซ์๋ก _spade_๋ผ๋ ์ด์ํ ๊ฐ์ ๊ฐ์ง๊ณ , ์นด๋์ ๋ชจ์์ผ๋ก _3_์ด๋ผ๋ ์ ๋ณด๋ฅผ ์ง๋๋ค.
์ํ๊น๊ฒ๋ ์ด๋ฌํ ์ํฉ์ ์์ด์ ์ปดํ์ผ ํ์์ ์๋ฌ๋ฅผ ์ฒดํฌํ ์ ์๋ค. primitive ํ์ ์ผ๋ก ์ ์ธํ์ผ๋ ๊ทธ ํ์ ์๋ง ๋ง๋ค๋ฉด ์๋ฌ๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋ณํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฌํ ํ์์ _primitive obsession anti pattern_์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋์ ๋์จ ๊ท์น์ด ๋ฐ๋ก ์์๊ฐ๊ณผ ๋ฌธ์์ด์ ํฌ์ฅํ๋ผ๋ ๊ฒ์ด๋ค. ์ฆ, ์์๊ฐ์ด๋ ๋ฌธ์์ด์ด ํน์ํ ์๋ฏธ๋ฅผ ์ง๋ ์ ์๋๋ก ์๋ก์ด ํด๋์ค ํ์ ์ ๋ถ์ฌํ๋ฉด ๋๋ค.
public enum CardSuit {
DIAMOND("๋ค์ด์๋ชฌ๋"),
HEART("ํํธ"),
SPADE("์คํ์ด๋"),
CLOBA("ํด๋ก๋ฒ");
private final String suitName;
CardSuit(String suitName) {
this.suitName = suitName;
}
public String getSuitName() {
return suitName;
}
}
ํด๋น ์ํฉ์ ๋ํด์๋ ํด๋์ค๊ฐ ๊ฐ์ง ์ ์๋ ํ๋กํผํฐ๊ฐ ํ์ ์ ์ด๋ฏ๋ก _enum_์ ์ฌ์ฉํด ์ฃผ์์ง๋ง, ๋๊ฐ์ ๊ฒฝ์ฐ _class_๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก _CardRank_์ ๋ํ ํด๋์ค ์์ฑ๋ ์๋ฃํด์ฃผ๊ณ , ์๋์ ๊ฐ์ด _Card_ ํด๋์ค๋ฅผ ์์ ํด์ฃผ์.
public class Card {
private CardSuit cardSuit;
private CardRank cardRank;
public Card(CardSuit cardSuit, CardRank cardRank) {
this.cardSuit = cardSuit;
this.cardRank = cardRank;
}
public String getCardFullName() {
return cardRank.getRankName() + cardSuit.getSuitName();
}
public String getCardRank() {
return cardRank.getRankName();
}
public String getCardSuit() {
return cardSuit.getSuitName();
}
}
์ด๋ค๊ฐ? ํจ์ฌ ๋ ๋ณด๊ธฐ ์ข๊ฒ ํด์๋๋ฉฐ, ์ปดํ์ผ ํ์์ ํ์ ์ฒดํฌ๊ฐ ๊ฐ๋ฅํด์ก๋ค. ๋ฐ๋ผ์, ์ด์ํ ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ์์์ ์ก์ ์ค ์ ์๋๋ก ๋ง๋ ๊ฒ์ด๋ค.
๊ท์น 4. ํ ์ค์ ์ ์ ํ๋๋ง ์ฐ๋๋ค.
์ด ๊ท์น์ ์ฌ์ค "๋๋ฏธํฐ ๋ฒ์น"๊ณผ ๋ฐ์ ํ ์ฐ๊ด์ด ์๋ค. ๋๋ฏธํฐ ๋ฒ์น์ ํต์ฌ์ ๊ฐ์ฒด ๊ทธ๋ํ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ฐ์ฒด์๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ์ค๊ณ๋ ์ต๋ํ ํผํ๋ผ๋ ๊ฒ์ด๋ค. ์ ์ด ๋ง์ด ์ฐํ ์๋ ๊ฒ์ ๊ฐ์ฒด๊ฐ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค๋ ๋ป์ด๋ฉฐ, ๊ทธ๋ฌํ ์ค๊ณ๋ ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋์ธ๋ค. ์ด๋ ๊ณง ์บก์ํ๋ฅผ ์งํค์ง ๋ชปํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
player.getCard().getRank()
์์ ์ํฉ์ ์ดํด๋ณด์๋ฉด, player ๊ฐ์ฒด๊ฐ ๊ตณ์ด ์ ๊ทผํ์ง ์์๋ ๋๋ ๊ฐ์ฒด๊น์ง ์ ๊ทผํด์ผ ํ๋ ๋ฌธ์ ์ ์ด ์๋ค. ์ด๋ก์ธํด ๊ฐ์ฒด๊ฐ ์์ ์ ์ญํ ์ ๋คํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง ์ ์๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ์ผ๋ก๋ "๊ฐ์ฒด์๊ฒ ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌ" ํ๋ ๋ฐฉ์์ ์ฌ์ฉํด๋ณด๋๋ก ํ์. ๊ตณ์ด player๊ฐ์ฒด๊ฐ Card ๊ฐ์ฒด์ ์ ๊ทผํ ํ์ ์์ด, Player ๊ฐ์ฒด์๊ฒ Card์ ์ ๊ทผํ์ฌ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ์ฑ ์์ ์์ํ๋ ๊ฒ์ด๋ค.
player.getCardRank();
๋จ, DTO๋ ์๋ฃ๊ตฌ์กฐ์ ๊ฒฝ์ฐ์๋ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ธ๋ถ๋ก ๋ ธ์ถํ๋ ๊ฒ์ด ๋น์ฐํ๋ฏ๋ก ๊ตณ์ด ๋๋ฏธํฐ ๋ฒ์น์ ์ ๊ฒฝ์ฐ์ง ์๋๋ค. Java Stream API๋ ์๊ธฐ ์์ ์ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ๋ฆฌํดํ๋ ๊ตฌ์กฐ์ด๋ฏ๋ก ๋ฉ์๋ ์ฒด์ด๋์ ์์ด ๋๋ฏธํฐ ๋ฒ์น์ ์ ์ฉํ์ง ์๋๋ค.
๊ท์น 5. ์ค์ฌ์ฐ์ง ์๋๋ค.
๋ฉ์๋ ์ด๋ฆ์ ์ถ์ฝํ๊ณ ์ถ์ ์๊ตฌ๋ ๋ฉ์๋๊ฐ ํ๊ณ ์๋ ์ผ์ด ๋๋ฌด๋๋ ๋ง๊ธฐ ๋๋ฌธ์ ์๊ธด๋ค. ์ด๋ SRP์ ์๋ฐ๋๋ ์ฌ๋ก์ด๋ฉฐ, ๋ฉ์๋๊ฐ ํ ๊ฐ์ง ์ผ์ ๋ชฐ๋ํ๋ค๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ฉ์๋ ์ด๋ฆ๋ ์ค์ด๋ค ๊ฒ์ด๋ค.
๋ํ ๋ฌธ๋งฅ์ด ์ค๋ณต๋๋ ์ผ์ด์ค๋ ๊ณ ๋ คํ์ฌ ๋ค์ด๋ฐ์ ๊ฒฐ์ ํ ์ ์๋ค. ๊ฐ๋ น, _Card_ ํด๋์ค์์ ์๋ก์ด _Card_๋ฅผ ๋ฝ๋ ํจ์๋ฅผ ์ง๋๋ค๊ณ ํ ๋, ๊ตณ์ด _pickCard()_๋ผ๊ณ ์ง์ ํ์๊ฐ ์์๊น? ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ๊ฐ๋จํ๊ฒ _Card_ ํด๋์ค์ _pick()_ ์ด๋ผ๊ณ ์ง์ด๋ ๋ ๋ฏ ์ถ๋ค.
๊ท์น 6. ๋ชจ๋ ์ํฐํฐ๋ฅผ ์๊ฒ ์ ์งํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, SRP๋ฅผ ์งํค๊ธฐ ์ํด 50์ค ์ด์ ๋๋ ํด๋์ค์ 10๊ฐ ์ด์๋๋ ํจํค์ง๋ ์ง์ํ์๋ผ๋ ๋ป์ด๋ค. ํด๋์ค๊ฐ ํ ๊ฐ์ง ์ผ์ ํ ์ ์๋๋ก ์ต์ ํ ์ ์๋ ์ข์ ๊ท์น์ธ ๊ฒ ๊ฐ๋ค.
๋ค๋ง, 50์ค์ด ๋์ผ๋ฉด ํฐ ์ผ ๋๋ค๋ ๊ฒ์ ์๋๊ณ , ๋๋ต ๊ทธ ์ ๋ ์ค๋ง ์ ์งํ๋ฉด ๋๋ค.
๊ท์น 7. 3๊ฐ ์ด์์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์ฐ์ง ์๋๋ค.
์ธ์คํด์ค ๋ณ์๊ฐ ๋ง๋ค๋ ๊ฒ์ ๊ณง, ํด๋์ค์ ์์ง๋๊ฐ ๋ฎ๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํ๋ค. ์ธ์คํด์ค ๋ณ์๊ฐ ์ด์ฉ ์ ์์ด ๋ง์์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฒด๋ฅผ ํ๋ ฅ ๊ฐ์ฒด๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์๊ฐํ๋ฉฐ ์ค๊ณํ์.

๊ท์น 8. ์ผ๊ธ ์ฝ๋ ์ ์ ์ด๋ค.
์ด์ ์ ๋ฐฐ์ ๋ ๋ชจ๋ ์์๊ฐ๊ณผ ๋ฌธ์์ด์ ํฌ์ฅํ๋ค๋ ๊ท์น๊ณผ ์ ์ฌํ๋ค. ์ผ๊ธ ์ฝ๋ ์ ์ Collection์ Wrappingํ๋ฉด์ ๊ทธ ์ธ์ ๋ค๋ฅธ ๋ฉค๋ฒ ๋ณ์๋ ์กด์ฌํ์ง ์๋ ํด๋์ค๋ฅผ ๋งํ๋ค.
[Java] ์ผ๊ธ ์ปฌ๋ ์ ๊ณผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋ํ์ฌ
์ผ๊ธ ์ปฌ๋ ์ ์ด๋(First Class Collection) ๐ฒ ์ผ๊ธ ์ปฌ๋ ์ : Collection์ Wrappingํ๋ฉด์, ๊ทธ ์ธ ๋ค๋ฅธ ๋ฉค๋ฒ ๋ณ์๋ ์๋ ์ํ๋ฅผ ๋งํ๋ค. public class GameRanking { private Map ranks; public GameRanking(Map ranks) { this.ranks = r
devrepo.tistory.com
๋น์ฆ๋์ค์ ์ข ์์ ์ธ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์์ฑํ ์ ์๊ณ , ๋ถ๋ณ์ฑ์ ๋ณด์ฅ, ์ํ์ ํ์๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌํ์ฌ ์ํ๊ฐ ํฉ์ด์ง๋ ๊ฒ์ ๋ง์ ์ ์์ผ๋ฉฐ, ์ด๋ฆ์ ๊ฒ์ํ ์ ์๋ ๋ฑ ๋ค์ํ ์ด์ ์์ ์ผ๊ธ ์ฝ๋ ์ ์ ์ฌ์ฉํ๋ค.
๊ท์น 9. getter, setter๋ฅผ ์ฐ์ง ์๋๋ค.
์ด ๊ท์น์ ์ด์ ์ "๋ฉ์ธ์ง๋ฅผ ๊ฐ์ฒด์๊ฒ ์ ๋ฌํด๋ผ"๋ผ๋ ๊ฒ๊ณผ ์ฐ๊ด์ด ๊น๋ค. ๊ฐ์ฒด๋ ์ค์ค๋ก๊ฐ ํด์ผํ๊ณ , ํ ์ ์๋ ์ฑ ๋ฌด๋ฅผ ๋คํด์ผ ํ๋ค. ์์ ์ ์ฑ ์์ ๋ฐ๋ผ ํ ์ ์๋ ์ผ์ ๊ตณ์ด ๋ฐ์์ getter์ setter๋ฅผ ํตํด ๊ฐ์ ธ์ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ํ๋๋ก ๋๋๋ฉด ์๋๋ค.
์ด์ ๋ฐ๋ผ ๊ฐ์ฒด๊ฐ ๊ฐ์ ธ์ผ ํ๋ ์ฑ ์์ ๊ฒฝ๊ณ๋ฅผ ์ต๋ํ ์์ง๋๊ฐ ๋๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ๋ฐ๋์งํ ๊ฒ์ด๋ค.
๋ฌผ๋ก ๋ชฉ์ ์ ๋ฐ๋ผ์ ๋จ์ํ ๊ฐ์ฒด์ ์ํ๋ฅผ ๊ฐ์ ธ์ ์ถ๋ ฅํ๋ ๋ก์ง์ ์์ด์๋ ๊ตณ์ด getter๋ฅผ ์ ํํ ํ์๋ ์๋ค๊ณ ๋ณธ๋ค. ํ์ง๋ง ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ํตํด ์ด๋ ํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด์ง ์๋ค.
ํ ๊ฐ์ฒด์ ์ํ์ ๋ํ ํ๋จ์ ๊ทธ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ์ง์ด์ผ ํ๋ค.
References
https://williamdurand.fr/2013/06/03/object-calisthenics/
https://hudi.blog/thoughtworks-anthology-object-calisthenics/