그것이 허용하는 연습을 패 루비의 기본 클래스와 같은 Fixnum?

StackOverflow https://stackoverflow.com/questions/238878

  •  04-07-2019
  •  | 
  •  

문제

나는 여전히 새로운 루비(읽기를 통해 곡괭이와 지출의 대부분에서 나의 시간 irb고),이제는 내가 그것을 알고 있는 것이 가능하 patch 클래스에서는 루비,나는지 궁금하면 그것은 그렇게,특히 여부를 허용하여 패치 루비의 기본 클래스입니다.예를 들어:내가 대답하되 다른 질문 Ruby 어디 포스터는 방법을 알고 싶어하는 시간을 빼서 DateTime.이후 DateTime 클래스하지 않는 것 같 이 기능을 제공,게시 응답하는 패치를 설치 DateTimeFixnum 클래스에 가능한 솔루션입니다.이 코드가 나는 제출된:

require 'date'

# A placeholder class for holding a set number of hours.
# Used so we can know when to change the behavior
# of DateTime#-() by recognizing when hours are explicitly passed in.

class Hours
   attr_reader :value

   def initialize(value)
      @value = value
   end
end

# Patch the #-() method to handle subtracting hours
# in addition to what it normally does

class DateTime

   alias old_subtract -

   def -(x) 
      case x
        when Hours; return DateTime.new(year, month, day, hour-x.value, min, sec)
        else;       return self.old_subtract(x)
      end
   end

end

# Add an #hours attribute to Fixnum that returns an Hours object. 
# This is for syntactic sugar, allowing you to write "someDate - 4.hours" for example

class Fixnum
   def hours
      Hours.new(self)
   end
end

나는 패치 클래스고 생각하기 때문에 이 인스턴스에서 그 결과 명확하고 간결한 구문을 빼서 고정된 시간에서 a DateTime.특히,당신이 할 수있는 뭔가가 다음과 같이 결과적으로 위의 코드:

five_hours_ago = DateTime.now - 5.hours

는 것으로 보인다는 상당히 보기 좋고 이해하기 쉬운;그러나 나는 확실하지 않는 것이 좋을 장난의 기능과 DateTimeko - 연산자입니다.

유일한 대안을 생각할 수 있고 이 상황에 대한 것:

1.단순히 새로 생성 DateTime object on-the-fly,컴퓨팅의 새로운 시간을 에서 전화 new

new_date = DateTime.new(old_date.year, old_date.year, old_date.month, old_date.year.day, old_date.hour - hours_to_subtract, date.min, date.sec)


2.쓰 유틸리티는 방법이 허용 DateTime 과 시간을 빼서

기본적으로,래퍼만 이 방법(1):

def subtract_hours(date, hours)
  return DateTime.new(date.year, date.month, date.day, date.hour - hours, date.min, date.sec)
end


3.를 추가하는 새로운 방법 DateTime 변경하는 대신,기존의 동작 #-()

아마도 새로운 DateTime#less 방법일 수 있는 함께 Fixnum#hours 패치를 할 수 있도록,다음과 같은 구문을 사용합니다.

date.less(5.hours)

그러나,이미 언급했다,나는 패치는 접근을 거라고 생각하기 때문에 나는 그것은 결과에서 훨씬 더 많은 표현한 구문입니다.

거기에 아무것도 잘못이 나의 접근,또는 해야 나를 사용하여 하나의 3 대안(또는 다른 하나는 생각하지 못했던)이렇게 하려면?나는 느낌을 가지고 있는 패치가 되는 내 새로운'해머'에 대한 문제에 루비,그래서 일부 의견 여부에 내가 하는 것이"루비는 방법"또는하지 않습니다.

도움이 되었습니까?

해결책

나 개인적인 답변,간단히 말해서: 핵심 클래스 패치를 망치해야 하단의 도구 상자.의 많은 다른 기술을 사용할 수 있고,거의 모든 경우에 그들이 충분하고,청소기,그리고 더 지속가능.

그것은 환경에서 당신은 코딩,하지만.면 그것을 개인적인 프로젝트지,접을 수 있습니다.문제 시작을 발생 작업하는 경우에 큰 codebase 오랜 기간 동안의 큰 그룹과는 프로그래머를 위한 것입니다.조직에서 내가 일하고 있는 루비 코드베이스의 통해 100KLOC 고물 또는 그래서 개발자,우리가 시작 단속에 원숭이 패치기 때문에,우리는 그것을 본 적도를 머리를 긁적,인간을 낭비하는 동작이 너무 많습니다.이 시점에서 우리는 꽤 많이만 허용을 위해 그것을 일시적으로 패치 타사 코드나지 않은 통합되거나지 않을 통합하는 우리의 원본다.

다른 팁

개인적으로,나는 그것이 허용을 추가하는 방법을 기본 클래스,하지만 허용을 수정의 구현을 기존 방법이 있습니다.

안전 방법은을 정의하는 자신의 클래스를 상속하는 내장되어 있어서,하나에 다음을 추가하는 새로운 물건의 새로운 클래스입니다.

class MyDateTime < DateTime
  alias...
  def...

그러나 분명히 문제는 새로운 행동을 선언할 경우에는 개체의 새로운 클래스입니다.

나는 생각한 그 다음과 같다:당신이 정직하게 느끼는 다른 대부분의 프로그래머는 것에 동의하는 헝겊 조각,그럼 괜찮습니다.지 않으면,아마도 당신이 대신 구현하는 코드 라이브러리?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top