U E D R , A S I H C RSS

서지혜/Calendar (rev. 1.9)

서지혜/Calendar


1. Lesson Learned

  • 으아니 왜 루비로 짜도 깔끔하고 예쁘지 않지.. 코드량의 감소가 얼마없어..
  • 루비의 attribute accessor 좀 편한거같다. lambda도 괜찮은거같고(디버깅할땐 빼고)..

2. java

  • Calendar class

public class Calendar {
    public static void main(String[] args) {
        System.out.println("Input year pleas : ex) 2013");
        System.out.print(">> ");

        Scanner scanner = new Scanner(System.in);
        int year = Integer.parseInt(scanner.nextLine());

        new Year(year).print();
    }
}
  • Month class

public class Month {
    private int month;
    private int length;
    private int startDate; // 1:mon 2:tue 3:wed 4:thu 5:fri 6 :sat 0:sun

    public Month(int month, int length, int startDate) {
        this.month = month;
        this.length = length;
        this.startDate = startDate;
    }

    public void print() {
        System.out.println("MONTH : " + month);
        System.out.println("sun\tmon\ttue\twed\tthu\tfri\tsat");

        String days = "";

        for (int i = 1; i <= startDate; i++) {
            days += "\t";
        }

        for (int i = 1; i <= length; i++) {
            days += i;
            days += ((i + startDate) % 7 == 0 ? "\n" : "\t");
        }

        System.out.println(days + "\n");
    }
}
  • Year class

public class Year {
    private int year;
    private List<Month> months;

    public Year(int year) {
        this.year = year;
        setMonths();
    }

    private void setMonths() {
        months = MonthFactory.getMonths(year);
    }

    public void print() {
        System.out.println("THIS YEAR IS : " + year + "\n\n");

        for (Month m : months) {
            m.print();
        }
    }
}
  • MonthFactory

public class MonthFactory {
    public static List<Month> getMonths(int year) {
        List<Month> months = new ArrayList();

        for (int i = 1; i <= 12; i++) {
            months.add(new Month(i, getDaysOfMonth(year, i), getStartDate(year, i)));
        }

        return months;
    }

    public static int getDaysOfYear(int year) {
        return isLeap(year) ? 366 : 365;
    }

    public static int getDaysOfMonth(int year, int month) {
        switch (month) {
            case 1: case 3: case 5: 
            case 7: case 8: case 10: case 12:
                return 31;
            case 4: case 6: case 9: case 11:
                return 30;
            case 2:
                return (isLeap(year) ? 29 : 28);
            default:
                return 0;
        }
    }

    public static boolean isLeap(int year) {
        return (year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0);
    }

    public static int getStartDate(int year, int month) {
        int totalDays = 0;

        for (int i = 1; i < year; i++) {    // add days of years
            totalDays += getDaysOfYear(i);
        }

        for (int i = 1; i < month; i++) {   // add days of months
            totalDays += getDaysOfMonth(year, i);
        }

        return (totalDays + 1) % 7;   // +1 for sunday
    }
}

3. ruby

  • Calendar class

class Calendar
  attr_accessor :year

  def initialize(year)
    @year = CalendarFactory.new.create(year)
  end

  def print_year
    @year.print_all
  end
end
  • Year class

class Year
  attr_accessor :year, :months, :is_leap

  def initialize(year, months, is_leap)
    @year = year
    @months = months
    @is_leap = is_leap
  end

  def print_all
    puts @year
    months.each { |month| month.print_month }
  end
end
  • Month class

class Month
  attr_accessor :month, :start_date, :length

  def initialize(month, length, start_date)
    @month = month
    @length = length
    @start_date = start_date
  end

  def print_month
    days = ""

    @start_date.times do
      days += "\t"
    end

    (1..@length).to_a.each { |day|
      days += day.to_s
      days += ((day + @start_date) % 7 == 0 ? "\n" : "\t")
    }

    puts month.to_s + "월", days, "\n"
  end
end
  • CalendarFactory class

class CalendarFactory
  def initialize
  end

  def create(year)
    Year.new(year, months_of_year(year), is_leap(year))
  end

  def months_of_year(year)
    months = [];
    (1..12).to_a.each { |month|
      months << Month.new(month, length_of_month(year, month), start_date(year, month))
    }
    months
  end

  def length_of_month(year, month)
    case month
      when 1, 3, 5, 7, 8, 10, 12
        return 31
      when 4, 6, 9, 11
        return 30
      when 2
        return (is_leap(year) ? 29 : 28)
    end
  end

  def start_date(year, month)
    total = 0;

    (1..year - 1).to_a.each { |x|
      total += (is_leap(x) ? 366 : 365)
    }
    (1..month - 1).to_a.each { |x|
      total += length_of_month(year, x)
    }

    (total + 1) % 7
  end

  def is_leap(year)
    (year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0)
  end
end
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:30:12
Processing time 0.0379 sec