1

저는 현재 서비스에 지시어에 존재하는 두 가지 방법을 리펙토링하려고합니다.Coffeescript에서 두 줄의 코드를 추상화하면

이 방법은 하나입니다

scope.computeStyle = (element, rowComponent) -> 
    elementHash = {} 
    if element.type == 'table' 
    elementHash.height = 600 
    if rowComponent?.height? 
     elementHash.height = rowComponent.height 
    else if element.type == 'single_value' 
    elementHash.height = 200 
    elementHash.width = 800 
    return elementHash 

그들은 모두 같은 일 (조금 다르게) 수행

scope.computeStyle = (component) -> 
    elementHash = {} 
    if component.element.type == 'table' 
    elementHash.height = 600 
    if component.height? 
     elementHash.height = component.height * 50 
    else if component.element.type == 'single_value' 
    elementHash.height = 200 
    elementHash.width = 800 
    return elementHash 

이 방법은 두 가지입니다. 그들은 element/component (내 응용 프로그램에서 개체에 대한 데이터를 포함하는 개체)를 가져 와서 개체 유형 (이 경우 테이블 또는 단일 값)을 확인하고 높이 및/또는 너비 변환을 적용합니다. 내 질문이 들어오는 곳

다음
angular = require "angular" 

angular.module("myapp.dashboards.layouts").service("DashboardLayoutComputeStyle" -> 

    @computeStyle = (componentElement, height) -> 
    elementHash = {} 
    if componentElement.type == 'table' 
     elementHash.height = 600 
     if height? 
     elementHash.height = height 
    else if element.type == 'single_value' 
     elementHash.height = 200 
     elementHash.width = 800 
    return elementHash 

    @ 
) 

이있어 :

내 추상화 방법이 라인에서 무엇을 할 확실하지 않다 : 내 서비스 내에서

이 내가 한 일이다

if component.height? 
     elementHash.height = component.height * 50 
0,123,516 : 방법의 하나에서
if height? 
    elementHash.height = height 

이는 모습입니다

  1. 내가 rowComponentheight 모두에 존재 여부를 확인해야합니다 나는이 두 라인의 리팩토링에 세 가지 제약이

    if rowComponent?.height? 
         elementHash.height = rowComponent.height 
    

    : 방법이에서

    이는 것처럼 보이는 것입니다 방법 2

  2. component이 존재 하는지를 확인할 필요는 없지만, 나는 height ex 방법이에, 나는 단순히 elementHash.height

rowComponent.height을 할당 할 수 있습니다 동안 방법의 하나의 메소드 하나

  • 에서 주의자는, 나는 elementHash,heightcomponent.height * 50로 설정해야하는 것 I 추상적이 두 줄 알아?

  • 답변

    0

    오히려 혼란스러운 시나리오인데, 나는 그것을 해체 해 보았습니다. 어떻게 작동해야하는지에 대해 잘못된 것이 있으면 저를 시정 해주십시오. 나는 당신의 결합 된 버전보다는 오리지널 기능 두 가지를 다루고 있습니다.

    • 는이 개 기능이 있지만 사실상 우리는이 일반적인 항목을 취할 수 있도록 그들 모두는 공통 (single_value)을 한 경우가 있고, 우리는 3 별개의 예 (single_value, tablerowComponent)
    • 두 번째 함수에서 요소는 유형을 확인하기 위해서만 rowComponent와 함께 전달됩니다. 대신에 나는 선택적 타입 인자 인 두 번째 변수를 선택할 것입니다.그것이 제공되지 않으면 요소의 유형을 사용할 것이고 방법 1과 똑같이 작동합니다.
    • 각 최상위 레벨 if 문이 요소 유형을 기반으로하기 때문에 좀 더 읽기 쉬운 경우로 변경했습니다 이전 방법 항목이라는 이제 문

    @computeStyle = (element, type) -> 
        # if no type is supplied, use the element's type 
        type ?= element.type 
        elementHash = {} 
        switch type 
         when 'rowComponent' 
         elementHash.height = if element?.height? 
          rowComponent.height 
         else 
          600 
         when 'table' 
         elementHash.height = if component.height? 
          component.height * 50 
         else 
          600 
         when 'single_value' 
         elementHash.height = 200 
         elementHash.width = 800 
        elementHash 
    

    , 당신은 computeStyle(element)을 사용할 수 있습니다, 당신은 방법 2를 사용하는 경우, 당신은 영업 이익의 의견에 따라 경찰 computeStyle(rowComponent, element.type)

    = 편집 = 를 사용할 수 로 rowComponent을 식별 할이 존재하지 않는, 나는 이것이 내가 찾던 정확히 무엇 대체 솔루션


    @computeStyle = (element, rowComponent) -> 
        elementHash = {} 
        # check the second argument to decide if we have a rowComponent or not 
        if element.type is table and rowComponent? 
         elementHash.height = if rowComponent.height? 
         rowComponent.height 
         else 
         600 
        # otherwise check the first elements type 
        else 
         switch element.type 
         when 'table' 
          elementHash.height = if component.height? 
          component.height * 50 
          else 
          600 
         when 'single_value' 
          elementHash.height = 200 
          elementHash.width = 800 
        elementHash 
    
    +0

    을 마련했습니다. 고맙습니다! 그것을 밖으로 시도하고 당신에게 돌아 가자. – theGreenCabbage

    +0

    방금 ​​시도했지만,'computerStyle (component)'옵션 입력으로 메소드를 사용하면'rowComponent'의'when' 조건을 입력하지 않습니다. ''rowComponent ''문자열 리터럴이라고하는 두 번째 입력이 필요합니까? – theGreenCabbage

    +0

    @theGreenCabbage 네,'rowComponent'가 다른 두 타입과 구별하기 위해 사용할 수있는'table' 또는'singleElement'과 다른 타입이 아니라면 선택적인 타입 var가 필요합니다. –