2013-10-10 4 views
0

나는 업무 시간표 응용 프로그램을 훌륭하게 사용하고 있습니다. 이제 모든 것이 잘 돌아가고 있으며, 리팩터링 시간입니다! 특히 몇몇 견해는 실제로 복잡합니다. 그래서 데코레이터를 사용하여 인스턴스를 정리하기 시작합니다.리팩토링 :보기의 서비스 개체

또 다른 것은 내가 상당한 양의 서비스 개체를 사용한다는 것입니다. 그들이 위대하고 내 모델을 깨끗하게 유지하는 동안, 내 견해에서 사용하면 원하지 않는 것입니다. 나는 약간의 리팩토링 조언을 찾고있다. 의 뷰 코드의 다음 조각을 살펴 보자 :

.row 
    .span12#timesheet 
     - days = @timesheet_builder.get_days_in_month 

     %table.table.days 
     %tbody 
      - (1..days).each do |day_nr| 
      - activity_date = Date.new(@timesheet.year, @timesheet.month, day_nr) 

      - if @timesheet_builder.is_workday?(day_nr) 
       - day_type = "workday" 
      - else 
       - day_type = "non_workday" 

      %tr.day(class=day_type) 
       %td.date{ "data-title" => "#{I18n.t('.timesheet.day_nr')}" } 
       .day_abbr= @timesheet_builder.get_day_name(day_nr) 
       .day_nr= day_nr 

은 무엇 당신이 보는 것은 일 달에 하루가 근무하는 경우 검사를 얻을 수있는 좋은 TimesheetBuilder 서비스 개체입니다. 결과에 따라 테이블의 행은 다른 색상이나 다른 마크 업을 얻습니다.

잘 작동하지만보기를 더 간단하게 만들려면 어떻게 리팩터링 할 수 있습니까? 데코레이터에서 서비스 오브젝트를 사용할 수 있습니까? 레일 협약에

+0

흥미로운 것처럼 보이는 Cells (http://cells.rubyforge.org)를보고있었습니다. 그것에 대한 의견? – John

+0

'- (1..days) .each do | day_nr |'=>'- days.times do | day_nr | ' – apneadiving

답변

2

가서 도우미에서 그들을 스틱 :

 
    module TimeSheetHelper #automatically included within TimeSheet views 
    def work_day_class(day) 
     @timesheet_builder.is_workday?(day_nr) ? "workday" : "non_workday" 
    end 
    end 

한편 .. 다시보기 :

 
    ... 
    %tr.day(class=work_day_class(day_nr)) 
    ... 

2

내가 싫어하는 경향이 양념 레일 개발자가되는 레일 헬퍼. 다수의 도우미가 성장하면 엉망이되는 경향이 있습니다. 그러나 귀하의 아이디어는 정확합니다. 비즈니스 로직을 캡슐화하기 위해 중간 객체를 사용하십시오. 당신도 here in Railscast 처럼, 당신의 자신의 솔루션을 만들어 갈 수 있습니다 또는 당신은 드레이퍼 같은 몇 가지 준비가 만든 라이브러리를 사용하여 추가 정보를 원하시면 다음을 볼 수 http://railscasts.com/episodes/286-draper https://github.com/drapergem/draper

나는 당신이 제안하는 사용 방법 같은 느낌

이 더 나은 OOP입니다/OOD 솔루션을 제공합니다. 또 다른 장점은 클래스 내부에 캡슐화 된 테스트 로직이 모듈 테스트보다 훨씬 쉽고 깨끗하다는 점입니다.

+0

도우미에 관해 당신의 의견에 동의합니다. 발표자 나 데코레이터 대신에 셀의 접근법을 정말 좋아합니다. – John