๐Ÿ“• [Object] 4์žฅ. ์„ค๊ณ„ ํ’ˆ์งˆ๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

๋ฐ•์ƒ๋ฏผยท2024๋…„ 2์›” 29์ผ

Book

๋ชฉ๋ก ๋ณด๊ธฐ
10/22
post-thumbnail

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฑ…์ž„์ด๋‹ค.

  • ํ›Œ๋ฅญํ•œ ์„ค๊ณ„๋ž€ ํ•ฉ๋ฆฌ์ ์ธ ๋น„์šฉ ์•ˆ์—์„œ ๋ณ€๊ฒฝ์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ›Œ๋ฅญํ•œ ์„ค๊ณ„์˜ ๊ฒฐ๊ณผ๋กœ ํƒ„์ƒํ•˜๋Š” ๊ฐ์ฒด๋Š” ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๊ณ  ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค.
  • ํ›Œ๋ฅญํ•œ ์„ค๊ณ„๋ฅผ ์œ„ํ•ด์„  ๊ฐ์ฒด์˜ ํ–‰๋™์— ์ดˆ์ ์„ ๋งž์ถฐ์•ผ ํ•œ๋‹ค. (๋‚ด๋ถ€ ๊ตฌํ˜„(ํ•„๋“œ ๋ฐ ํ•„๋“œ ์ˆ˜์ • ํ”ผํ•จ)
    • ๊ฐ์ฒด๋ฅผ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ์‹œ๊ฐ์€ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์— ๋…ธ์ถœ์‹œํ‚ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ๋Š”๋‹ค.
    • ์ฆ‰ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ๋…ธ์ถœ์‹œํ‚ค๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๋…ธ์ถœ์‹œํ‚จ๋‹ค.
      • ๋ฌด์ง€์„ฑ getter, setter๋Š” ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค.

์ฑ…์ž„์„ ์ค‘์‹ฌ์œผ๋กœ ์‹œ์Šคํ…œ์„ ํ›„๋ณด(์—ญํ• , ๊ฐ์ฒด, ํด๋ž˜์Šค)๋กœ ๋ถ„ํ• ํ•œ๋‹ค.

โญ๏ธ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์˜ํ™” ์‹œ์Šคํ…œ

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋Š” 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ์„ ๊ฐ์ฒด๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒํƒœ(๋ฐ์ดํ„ฐ)๋ฅผ ๋ถ„ํ• ์˜ ์ค‘์‹ฌ์ถ•์œผ๋กœ
  • ์ฑ…์ž„์„ ๋ถ„ํ• ์˜ ์ค‘์‹ฌ์ถ•์œผ๋กœ

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ๊ด€์ ์—์„œ ๊ฐ์ฒด๋Š” ์ž์‹ ์ด ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์˜คํผ๋ ˆ์ด์…˜์„ ์ •์˜ํ•œ๋‹ค. -> ์ƒํƒœ์— ์ดˆ์ 
์ฑ…์ž„ ์ค‘์‹ฌ์˜ ๊ด€์ ์—์„œ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํผ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค. -> ์ฑ…์ž„์— ์ดˆ์ 

์‹œ์Šคํ…œ์„ ๋ถ„ํ• ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฑ…์ž„์— ์ดˆ์ ์„ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊ตฌํ˜„์— ์†ํ•œ๋‹ค. ๊ตฌํ˜„์€ ๋ถˆ์•ˆ์ • ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ•˜๊ธฐ ์‰ฝ๋‹ค.
์ƒํƒœ๋ฅผ ๋ถ„ํ• ์˜ ์ค‘์‹ฌ์ถ•์œผ๋กœ ๋ณด๋ฉด, ๊ตฌํ˜„์— ๊ด€ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ์ด ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์Šค๋ฉฐ๋“ค๊ฒŒ ๋˜์–ด ์บก์Аํ™”์˜ ์›์น™์ด ๋ฌด๋„ˆ์ง„๋‹ค.

์ด์— ๋ฐ˜ํ•ด ๊ฐ์ฒด์˜ ์ฑ…์ž„์€ ์ธํ„ฐํŽ˜์ด์Šค์— ์†ํ•œ๋‹ค.

  • ๊ฐ์ฒด๋Š” ์ฑ…์ž„์„ ๋“œ๋Ÿฌ๋‚ด๋Š” ์•ˆ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค ๋’ค๋กœ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์บก์Аํ™” ํ•จ์œผ๋กœ์จ ๊ตฌํ˜„ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ํŒŒ์žฅ์ด ์™ธ๋ถ€๋กœ ํผ์ ธ๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ์™€ accessot, mutator๋งŒ ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค๋“ค

ReservationAgency ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์กฐํ•ฉํ•ด์„œ ์˜ํ™” ์˜ˆ๋งค ์ ˆ์ฐจ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

public class ReservationAgency {
    public Reservation reserve(Screening screening, Customer customer,
                               int audienceCount) {
        Movie movie = screening.getMovie();

        boolean discountable = false;
        for(DiscountCondition condition : movie.getDiscountConditions()) {
            if (condition.getType() == DiscountConditionType.PERIOD) {
                discountable = screening.getWhenScreened().getDayOfWeek().equals(condition.getDayOfWeek()) &&
                        condition.getStartTime().compareTo(screening.getWhenScreened().toLocalTime()) <= 0 &&
                        condition.getEndTime().compareTo(screening.getWhenScreened().toLocalTime()) >= 0;
            } else {
                discountable = condition.getSequence() == screening.getSequence();
            }

            if (discountable) {
                break;
            }
        }

        Money fee;
        if (discountable) {
            Money discountAmount = Money.ZERO;
            switch(movie.getMovieType()) {
                case AMOUNT_DISCOUNT:
                    discountAmount = movie.getDiscountAmount();
                    break;
                case PERCENT_DISCOUNT:
                    discountAmount = movie.getFee().times(movie.getDiscountPercent());
                    break;
                case NONE_DISCOUNT:
                    discountAmount = Money.ZERO;
                    break;
            }

            fee = movie.getFee().minus(discountAmount).times(audienceCount);
        } else {
            fee = movie.getFee().times(audienceCount);
        }

        return new Reservation(customer, screening, fee, audienceCount);
    }
}

Discountcondition์— ๋Œ€ํ•ด ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ํ• ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
discountable ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฒดํฌํ•˜๊ณ  ์ ์ ˆํ•œ ํ• ์ธ ์ •์ฑ…์— ๋”ฐ๋ผ ์˜ˆ๋งค ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

โญ๏ธ ์„ค๊ณ„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

๊ฐ์ฒด์ง€ํ–ฅ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ข‹์€ ์„ค๊ณ„์˜ ํŠน์ง•์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์— ๊ด€ํ•œ ๋‹ค์–‘ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์–ด ์™”๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์„ค๊ณ„์™€ ์ฑ…์ž„ ์ค‘์‹ฌ ์„ค๊ณ„์˜ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์บก์Аํ™”, ์‘์ง‘๋„, ๊ฒฐํ•ฉ๋„๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค.

๐Ÿ“Œ ์บก์Аํ™”

์ƒํƒœ์™€ ํ–‰๋™์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด ์•ˆ์— ๋ชจ์œผ๋Š” ์ด์œ ๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๊ฐ์ถ”๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

ํ•„๋“œ๊ฐ€ ์•ˆ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ

์˜ค์ง ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ฐ–์œผ๋กœ ๋“œ๋Ÿฌ๋‚œ๋‹ค. ๋ณ€๊ฒฝ๋ ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ฒƒ์ด๋ผ๋„ ์บก์Аํ™”ํ•ด์•ผ ํ•œ๋‹ค.

์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋ชฉํ‘œ๋‹ค. ์—ฌ๊ธฐ์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด๋ž€ ๋‘๋ ค์›€ ์—†์ด, ์ฃผ์ €ํ•จ ์—†์ด, ์ €ํ•ญ๊ฐ ์—†์ด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๋งํ•œ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋™๋ฃŒ๋Š” ์บก์Аํ™”๋‹ค. ์บก์Аํ™”๋ž€ ์–ด๋–ค ๊ฒƒ์„ ์ˆจ๊ธด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์˜ ํ•œ ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ๋ถ€๋ถ„์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ถค์œผ๋กœ์จ ๋œป๋ฐ–์˜ ํ”ผํ•ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์‹œ์Šคํ…œ์ด ์™„์ „ํžˆ ์บก์Аํ™”๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์™„์ €ํžˆ ์ž์œ ๋กœ์›Œ์งˆ ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ์‹œ์Šคํ…œ์˜ ์บก์Аํ™”๊ฐ€ ํฌ๊ฒŒ ๋ถ€์กฑํ•˜๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กœ์šธ ์ˆ˜ ์—†๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹œ์Šคํ…œ์€ ์ง„ํ™”ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค. ์‘์ง‘๋„, ๊ฒฐํ•ฉ๋„, ์ค‘๋ณต ์—ญ์‹œ ํ›Œ๋ฅญํ•œ(๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ) ์ฝ”๋“œ๋ฅผ ๊ทœ์ •ํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ํ’ˆ์งˆ์ธ ๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ ์บก์Аํ™”๋Š” ์šฐ๋ฆฌ๋ฅผ ์ข‹์€ ์ฝ”๋“œ๋กœ ์•ˆ๋‚ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ œ1์›๋ฆฌ๋‹ค[Bain08].

๐Ÿ“Œ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„

๊ตฌ์กฐ์  ์„ค๊ณ„ ๋ฐฉ๋ฒ•์ด ์ฃผ๋„ํ•˜๋˜ ์‹œ๋Œ€์˜ ๊ธฐ์ค€์ด๋‚˜ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‹œ๋Œ€์—๋„ ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋‹ค.

์‘์ง‘๋„ย 

  • ๊ฐ์ฒด์ง€ํ–ฅ ๊ด€์ ์—์„œ์˜ ์‘์ง‘๋„๋Š” ๊ฐ์ฒด ๋˜๋Š” ํด๋ž˜์Šค์— ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ ๋†’์€ ์ฑ…์ž„๋“ค์„ ํ• ๋‹นํ–ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ๋ชจ๋“ˆ์— ํฌํ•จ๋œ ๋‚ด๋ถ€ ์š”์†Œ๋“ค์ด ์—ฐ๊ด€๋ผ ์žˆ๋Š” ์ •๋„
    • ๋ชจ๋“ˆ ๋‚ด์˜ ์š”์†Œ๋“ค์ด ํ•˜๋‚˜์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ˜‘๋ ฅํ•œ๋‹ค๋ฉด ๊ทธ ๋ชจ๋“ˆ์€ ๋†’์€ ์‘์ง‘๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
    • ๋ชจ๋“ˆ ๋‚ด์˜ ์š”์†Œ๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์ถ”๊ตฌํ•œ๋‹ค๋ฉด ๊ทธ ๋ชจ๋“ˆ์€ ๋‚ฎ์€ ์‘์ง‘๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

๊ฒฐํ•ฉ๋„

  • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ด€์ ์—์„œ ๊ฒฐํ•ฉ๋„๋Š” ๊ฐ์ฒด ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ํ˜‘๋ ฅ์— ํ•„์š”ํ•œ ์ ์ ˆํ•œ ์ˆ˜์ค€์˜ ๊ด€๊ณ„๋งŒ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ์˜์กด์„ฑ์˜ ์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ง€์‹์„ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฒ™๋„๋‹ค.
    • ์ฆ‰, ๋…๋ฆฝ์  ๋ณ€๊ฒฝ์ด ์œ ์—ฐํ•จ์˜ ์ •๋„๋‹ค.

๋ณ€๊ฒฝ์˜ ๊ด€์ ์—์„œ ์‘์ง‘๋„๋ž€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณ€๊ฒฝ์˜ ์ •๋„๋‹ค.
ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ์„ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“ˆ ์ „์ฒด๊ฐ€ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์‘์ง‘๋„๊ฐ€ ๋†’์€ ๊ฒƒ์ด๊ณ , ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์€ ๊ฒƒ์ด๋‹ค.
๋˜ํ•œ ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋งŒ ๋ณ€๊ฒฝ๋˜๋ฉด ์‘์ง‘๋„๊ฐ€ ๋†’์ง€๋งŒ, ๋‹ค์ˆ˜์˜ ๋ชจ๋“ˆ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์€ ๊ฒƒ์ด๋‹ค.


์œ„ ๊ทธ๋ฆผ์€ ๋ณ€๊ฒฝ๊ณผ ์‘์ง‘๋„ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ฆผ์„ ํ‘œํŽธํ•œ ๊ฒƒ์ด๋‹ค.
๋†’์€ ์‘์ง‘๋„(High Cohesion)

  • ํ•˜๋‚˜์˜ ์š”๊ทœ์‚ฌํ•ญ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์˜ค์ง ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

๋‚ฎ์€ ์‘์ง‘๋„(Low Cohesion)

  • ํ•˜๋‚˜์˜ ์›์ธ์— ์˜ํ•ด ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋‹ค์ˆ˜์˜ ๋ชจ๋“ˆ์— ๋ถ„์‚ฐ๋ผ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ๋™์‹œ์— ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

์‘์ง‘๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ๋ณ€๊ฒฝ์˜ ๋Œ€์ƒ๊ณผ ๋ฒ”์œ„๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.


๊ฒฐํ•ฉ๋„ ์—ญ์‹œ ๋ณ€๊ฒฝ์˜ ๊ด€์ ์—์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐํ•ฉ๋„๋Š” ํ•œ ๋ชจ๋“ˆ์ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ•˜๋Š” ์ •๋„๋กœ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ฎ์€ ๊ฒฐํ•ฉ๋„(Low Coupling)

  • ๋ชจ๋“ˆ A๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ์˜ค์ง ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋งŒ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

๋†’์€ ๊ฒฐํ•ฉ๋„(High Coupling)

  • ๋ชจ๋“ˆ A๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ 4๊ฐœ์˜ ๋ชจ๋“ˆ์„ ๋™์‹œ์— ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

โญ๏ธ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์˜ํ™” ์˜ˆ๋งค ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ์ 

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋Š” ์บก์Аํ™”๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๋กœ ๋งŒ๋“ ๋‹ค.
๋ฐ˜๋ฉด, ์ฑ…์ž„ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•ˆ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค ๋’ค๋กœ ์บก์Аํ™”ํ•œ๋‹ค.

์บก์Аํ™”์˜ ์ •๋„๊ฐ€ ๊ฐ์ฒด์˜ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๊ฐ€ ๊ฐ€์ง„ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ์ ๋“ค

  • ์บก์Аํ™” ์œ„๋ฐ˜
  • ๋†’์€ ๊ฒฐํ•ฉ๋„
  • ๋‚ฎ์€ ์‘์ง‘๋„

๐Ÿ“Œ ์บก์Аํ™” ์œ„๋ฐ˜

public class Movie {
	private Money fee;
    
    public Money getFee() {
    	return fee;
    }
    
    public void setFee(Money fee) {
    	this.fee = fee;
    }
}

get, set ๋ฉ”์„œ๋“œ๋Š” Movie ๋‚ด๋ถ€์— Money ํƒ€์ž…์˜ fee๋ผ๋Š” ์ด๋ฆ„์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์— ๋…ธ๊ณจ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.

Movie๊ฐ€ ์บก์Аํ™”์˜ ์›์น™์„ ์–ด๊ธฐ๊ฒŒ ๋œ ๊ทผ๋ณธ์ ์ธ ์›์ธ์€ ๊ฐ์ฒด๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ฑ…์ž„์ด ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์— ์ดˆ์ ์„ ๋งž์ท„๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐ์ฒด์— ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฑ…์ž„์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ์ฑ…์ž„์€ ํ˜‘๋ ฅ์ด๋ผ๋Š” ๋ฌธ๋งฅ์„ ๊ณ ๋ คํ•  ๋•Œ๋งŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ๋†’์€ ๊ฒฐํ•ฉ๋„

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋Š” ์ ‘๊ทผ์ž์™€ ์ˆ˜์ •์ž๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์บก์Аํ™”๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค. ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ตฌํ˜„์ด ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ๋“œ๋Ÿฌ๋‚œ๋‹ค๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์œ ์†Œ์‹์€ ๋‹จ์ง€ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ–ˆ์Œ์—๋„ ์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค๋„ ํ•จ๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


์œ„ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์ œ์–ด ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ œ์–ด ๊ฐ์ฒด์ธ ReservationAgency๊ฐ€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. DiscountCondition์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด DiscountCondition๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ReservationAgency๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ“Œ ๋‚ฎ์€ ์‘์ง‘๋„

์„œ๋กœ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“ˆ ์•ˆ์— ๊ณต์กดํ•˜๋ฉด ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค.
์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ด์œ ๋ฅผ ์ฐพ์•„๋ณด์ž

ReservationAgency๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ด์œ 

  • ํ• ์ธ์ •์ฑ… ์ถ”๊ฐ€
  • ํ• ์ธ ์ •์ฑ…๋ณ„ ๊ณ„์‚ฐ ๋กœ์ง ๋ณ€๊ฒฝ
  • ํ• ์ธ ์กฐ๊ฑด ์ถ”๊ฐ€
  • ์˜ˆ๋งค ์š”๊ธˆ ๊ณ„์‚ฐ ๋ฐฉ์‹ ๋ณ€๊ฒฝ
  • ํ• ์ธ ์กฐ๊ฑด๋ณ„ ํ• ์ธ ์—ฌ๋ถ€ ํŒ๋‹จ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ

๋‚ฎ์€ ์‘์ง‘๋„๋Š” ๋‘๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ์„ค๊ณ„์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค

  • ๋ณ€๊ฒฝ์˜ ์›์ธ์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์ด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ ์•ˆ์— ๋ญ‰์ณ์žˆ์–ด ๋ณ€๊ฒฝ๊ณผ ์•„๋ฌด ์ƒ๊ด€ ์—†๋Š” ์ฝ”๋“œ๋“ค์ด ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

    • ํ• ์ธ ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ• ์ธ ์กฐ๊ฑด์„ ํŒ๋‹จํ•˜๋Š” ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ๋™์‹œ์— ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

    • ํ• ์ธ ์ •์ฑ…์ด ์ถ”๊ฐ€๋˜๋ฉด 3๊ฐœ์˜ ๋ชจ๋“ˆ์ด ๋™์‹œ์— ๋ณ€๊ฒฝ๋œ๋‹ค.
      • MoneyType enum ์—ด๊ฑฐํ˜• ๊ฐ’ ์ถ”๊ฐ€
      • ReservationAgency Switch์— case ์ถ”๊ฐ€
      • Movie์— ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

โญ๏ธ ์ž์œจ์ ์ธ ๊ฐ์ฒด๋ฅผ ํ–ฅํ•ด

๐Ÿ“Œ ์บก์Аํ™”๋ฅผ ์ง€์ผœ๋ผ

์บก์Аํ™”๋Š” ์„ค๊ณ„์˜ ์ œ 1์›๋ฆฌ๋‹ค. ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๊ฐ€ ๋‚ฎ์€ ์‘์ง‘๋„์™€ ๋†’์€ ๊ฒฐํ•ฉ๋„๋ผ๋Š” ๋ฌธ์ œ๋กœ ๋ชธ์‚ด์„ ์•“๊ฒŒ ๋œ ๊ทผ๋ณธ์ ์ธ ์›์ธ์€ ๋ฐ”๋กœ ์บก์Аํ™”์˜ ์›์น™์„ ์œ„๋ฐ˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐ์ฒด๋Š” ์ž์‹ ์ด ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋‚ด๋ถ€์— ์บก์Аํ™”ํ•˜๊ณ  ์™ธ๋ถ€์— ๊ณต๊ฐœํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๊ฐ์ฒด๋Š” ์Šค์Šค๋กœ์˜ ์ƒํƒœ๋ฅผ ์ฑ…์ž„์ ธ์•ผ ํ•˜๋ฉฐ ์™ธ๋ถ€์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒํƒœ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ์ œ: ์‚ฌ๊ฐํ˜•์˜ ๋„ˆ๋น„์˜ ๋†’์ด๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ฝ”๋“œ

class AnyClass{
	void anyMethod(Rectangle rectangle, int multiple){
    rectangle.setRight(rectangle.getRight()*multiple)
    rectangle.setBottom(rectangle.getBottom()*multiple)
   }

}

ํ•ด๋‹น ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

  • ์ฝ”๋“œ ์ค‘๋ณต: ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋น„์Šทํ•œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ€๊ฒฝ์— ์ทจ์•ฝ: rectangle ๊ฐ€๋กœ์„ธ๋กœ => 4๊ฐœ ์ขŒํ‘œ๋กœ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐ”๋€Œ๋ฉด ์œ„ ์ฝ”๋“œ๋Š” ์ „๋ฉด์ ์œผ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•จ.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”์‹œํ‚ค์ž

class Rectangle{
   public void enlarge(int multiple){
   		right *= multiple;
        bottom *= multiple; 
   }
}

Rectangle ๋‚ด๋ถ€์— ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋กœ์ง์„ ์บก์Аํ™”ํ•˜๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ์Šค์Šค๋กœ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ…์ž„์ง€๋Š” ๊ฐ์ฒด

  • ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๊ฐ์ฒด๊ฐ€ ํ˜‘๋ ฅํ•˜๋ฉฐ ์ˆ˜ํ–‰ํ•  ์ฑ…์ž„์„ ์ •์˜ํ•˜๋Š” ์˜คํŽ˜๋ ˆ์ด์…˜์ด ๋” ์ค‘์š”ํ•˜๋‹ค.

๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ "์ด ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๋Š”๊ฐ€?"๋ผ๋Š” ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ๊ฐ™์€ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„์ ์ธ ์งˆ๋ฌธ์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

  • ์ด ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
  • ์ด ๊ฐ์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜์€ ๋ฌด์—‡์ธ๊ฐ€?

์ด์ „์˜ ์„ค๊ณ„๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์ž.

  • ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋” ๋ฉด๋ฐ€ํ•˜๊ฒŒ ์บก์Аํ™” ์‹œํ‚ค์ž.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋งŒ๋“ค์ž.

๋”ฐ๋ผ์„œ ์ด ๊ฐ์ฒด๋“ค์ด ์Šค์Šค๋กœ ์ฑ…์ž„์ง€๋„๋ก ๋งŒ๋“ค์ž.

์ฒซ๋ฒˆ์งธ ์„ค๊ณ„

๋‘๋ฒˆ์งธ ์„ค๊ณ„

๋‘ ์„ค๊ณ„๋ฅผ ๋น„๊ตํ•ด๋ณด์ž. ๋ฌด์—‡์ด ๋” ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋ณด์ด๋Š”๊ฐ€?
์ตœ์†Œํ•œ ๊ฒฐํ•ฉ๋„ ์ธก๋ฉด์—์„œ ReservationAgency์— ์˜์กด์„ฑ์ด ๋ชฐ๋ ค์žˆ๋˜ ์ฒซ ๋ฒˆ์งธ ์„ค๊ณ„๋ณด๋‹ค๋Š” ๋‘ ๋ฒˆ์งธ ์„ค๊ณ„๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋ณด์ธ๋‹ค.

โญ๏ธ ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•˜๋‹ค.

์‚ฌ์‹ค ๋‘ ๋ฒˆ์งธ ์„ค๊ณ„ ์—ญ์‹œ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„ ๋ฐฉ์‹์— ์†ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด์ž.

๐Ÿ“Œ ์บก์Аํ™” ์œ„๋ฐ˜

๋ถ„๋ช…ํžˆ ์ˆ˜์ •๋œ ๊ฐ์ฒด๋“ค์€ ์ž๊ธฐ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์Šค๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DiscountCondition์€ ์ž๊ธฐ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ํ• ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์Šค์Šค๋กœ ํŒ๋‹จํ•œ๋‹ค.

DiscountCondition์€ ๋‚ด๋ถ€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์™ธ๋ถ€์— ๋…ธ์ถœํ•œ๋‹ค.

  • sequence, dayOfWeek ...

Movie๋Š” ํ• ์ธ ์ •์ฑ…์˜ ์ข…๋ฅ˜(case, if)๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์— ๋…ธ์ถœ์‹œํ‚ค๊ณ  ์žˆ๋‹ค.

  • Screening์—์„œ Movie์˜ getType๋ฅผ ์ด์šฉํ•ด์„œ switch
  • ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ…์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋˜๋ฉด Screening์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

์บก์Аํ™”์˜ ์ง„์ •ํ•œ ์˜๋ฏธ
์‚ฌ์‹ค ์บก์Аํ™”๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ฒƒ์ด๋ผ๋„ ๊ฐ์ถ”๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‚ด๋ถ€ ์†์„ฑ์„ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๊ฐ์ถ”๋Š” ๊ฒƒ์€ '๋ฐ์ดํ„ฐ ์บก์Аํ™”'๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์บก์Аํ™”์˜ ํ•œ ์ข…๋ฅ˜์ผ ๋ฟ์ด๋‹ค.
์ง„์ •ํ•œ ์บก์Аํ™”๋Š” ์†์„ฑ ํƒ€์ž…์ด๊ฑด, switch๋ฌธ์˜ case์ด๊ฑด ๊ด€๊ณ„์—†์ด ๊ตฌํ˜„๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์€ ๋ชจ๋‘ ๊ฐ์ถ”๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“Œ ๋†’์€ ๊ฒฐํ•ฉ๋„

์‚ฌ์šฉ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ type์„ ๊บผ๋‚ด์„œ switchํ•˜๋Š” ๊ฒฝ์šฐ, ๋‚ด๋ถ€ type์˜ ์ผ€์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์‚ฌ์šฉ์ฒ˜๋ฅผ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.

  • DiscountCondition ๋ณ€๊ฒฝ => Movie ๋ณ€๊ฒฝ

DiscountCondition์˜ ๋งŒ์กฑ ์—ฌ๋ถ€ ํŒ๋‹จ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด isDiscountable์˜ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. (whenScreened,sequence ๋‘˜ ๋‹ค ์“ฐ๊ณ  ์žˆ์Œ)

  • ์ด ์ •๋ณด๋Š” Screening์—์„œ Movie๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ

DiscountCondition ๋ณ€๊ฒฝ => Movie ๋ณ€๊ฒฝ => Screening ๋ณ€๊ฒฝ

ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ์„ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ๋™์‹œ์— ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ“Œ ๋‚ฎ์€ ์‘์ง‘๋„

DiscountCondition์ด ํ• ์ธ ์—ฌ๋ถ€ ํŒ๋‹จ์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด

  • Movie์˜ isDiscountable ํŒŒ๋ผ๋ฏธํ„ฐ ์ข…๋ฅ˜๋ฅผ ๋ณ€๊ฒฝ -> Screening์˜ Movie ํ˜ธ์ถœ ๋ณ€๊ฒฝ

ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ์„ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ณณ(๋‚ด๋ถ€์˜ ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ)์„ ๋™์‹œ์— ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋‚ด๋ถ€ ๊ตฌํ˜„(DiscountCondition์˜ ํ•„๋“œ)์ด ๋…ธ์ถœ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โญ๏ธ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์„ค๊ณ„์˜ ๋ฌธ์ œ์ 

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๊ฐ€ ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•œ ์ด์œ  ๋‘ ๊ฐ€์ง€

  • ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋„ˆ๋ฌด ์ด๋ฅธ ์‹œ๊ธฐ์— ๋ฐ์ดํ„ฐ์— ๊ด€ํ•ด ๊ฒฐ์ •ํ•˜๋„๋ก ๊ฐ•์š”ํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„์—์„œ๋Š” ํ˜‘๋ ฅ์ด๋ผ๋Š” ๋ฌธ๋งฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด๋ฅผ ๊ณ ๋ฆฝ์‹œํ‚จ ์ฑ„ ์˜คํผ๋ ˆ์ด์…˜์„ ๊ฒฐ์ •ํ•œ๋‹ค.

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์„ค๊ณ„๋Š” ๊ฐ์ฒด์˜ ํ–‰๋™๋ณด๋‹ค๋Š” ์ƒํƒœ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋˜์กŒ๋˜ ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์€ "์ด ๊ฐ์ฒด๊ฐ€ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?"๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๊ตฌํ˜„์˜ ์ผ๋ถ€์ด๋‹ค.

๋ฐ์ดํ„ฐ ์ฃผ๋„ ์„ค๊ณ„๋Š” ์‹œ์ž‘ํ•˜๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ์— ๊ด€ํ•ด ๊ฒฐ์ •ํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ์ด๋ฅธ ์‹œ๊ธฐ์— ๋‚ด๋ถ€ ๊ตฌํ˜„์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ๊ด€์ ์—์„œ ๊ฐ์ฒด๋Š” ๊ทธ์ € ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ฒด์ผ ๋ฟ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ์ ‘๊ทผ์ž์™€ ์ˆ˜์ •์ž๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ  ์ด ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๋ถ„๋ฆฌ๋œ ๋ณ„๋„์˜ ๊ฐ์ฒด ์•ˆ์— ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋Š” ๋„ˆ๋ฌด ์ด๋ฅธ ์‹œ๊ธฐ์— ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บก์Аํ™”์— ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๊ณ  ๊ฐ์ฒด์˜ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„์— ๋‚˜์œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•œ ์ฝ”๋“œ๋ฅผ ๋‚ณ๊ฒŒ ๋œ๋‹ค.

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์„ค๊ณ„๋Š” ๊ฐ์ฒด๋ฅผ ๊ณ ๋ฆฝ์‹œํ‚จ ์ฑ„ ์˜คํผ๋ ˆ์ด์…˜์„ ์ •์˜ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ํ˜‘๋ ฅํ•˜๋Š” ๊ฐ์ฒด๋“ค์˜ ๊ณต๋™์ฒด๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜‘๋ ฅ์ด๋ผ๋Š” ๋ฌธ๋งฅ ์•ˆ์—์„œ ํ•„์š”ํ•œ ์ฑ…์ž„์„ ๊ฒฐ์ •ํ•˜๊ณ  ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ ์ ˆํ•œ ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.
์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋ฌด๊ฒŒ ์ค‘์‹ฌ์€ ํ•ญ์ƒ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์— ๋งž์ถฐ์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค.


์ถœ์ฒ˜
์˜ค๋ธŒ์ ํŠธ - ์ฝ”๋“œ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„
https://github.com/eternity-oop/object

0๊ฐœ์˜ ๋Œ“๊ธ€