상당히 큰 Ruby 응용 프로그램에서 우리는 주어진 객체가 이름과 ID의 두 가지로 식별되는 상황을 말합니다. 이 값 유형은 각각 다른 용도로 사용되기 때문에 정확히 동일하지는 않습니다 (다른 장소에서 ID와 이름을 유지). 그래서 우리는 응용 프로그램 (ID, 이름 및 객체) 주위로 전달되는 다양한 값으로 마무리합니다. 이 상황은 적어도 어느 정도는 문제로 보입니다. 왜냐하면 우리는 이미 어떤 함수가 어떤 함수에 전달되어야하는지 명확하지 않은 버그에 이미 물 렸기 때문입니다. 저는 실제로 몇 년 동안 여러 가지 응용 프로그램에서 유사한 문제 코드를 보았습니다. 그러나 다시 특정 이름을 지정하지는 않았습니다."messy-polymorphism"anti-pattern
루비는 타입없는 언어로서, C++과 같은 방식으로 고전적인 타입 기반의 다형 함수를 허용하지 않습니다. 주위의 작품으로, 동료들은 이런 종류의 코드를 의지했습니다
def initialize starting_value
if starting_post.kindof? Foo
@starting_id = get_id_from_foo starting_value
elsif starting_post.kindof? Bar
@starting_id = get_id_from_bar starting_value
else
raise "illegal type"
end
end
우리의 코드베이스 (뿐만 아니라 초기화) 나는 "지저분한 - 다형성"이라고 부르는 결과 약이 코드의 확산. 종종 효과가 있지만 때로는 매우 혼란스러운 상황을 만듭니다.
나는 이에 대해 세 가지 질문이 있습니다.
- 정식 이름이 안티 패턴입니까? "지저분한 인터페이스?", "지저분한 다형성?" 또는 다른 것?
- 사람들이 얼마나 나쁠 것이라고 생각하십니까?
- 리팩토링하는 체계적인 방법이 있습니까? 우리가 작성한 많은 테스트가 일반 리팩터링과 함께하는 도전은이 루스 타이핑을 사용하므로 테스트와 구현을 동시에 변경해야하고 일반 테스트의 스캐 폴드 효과가 없으므로 기반의 리팩토링. 나는이 느슨한 다형성을 실제로 강화시킬 수 있다고 생각한다. 즉, 을 추상화하고 코드를 함수로 추출한다. 하지만 이 좋은 아이디어일까요?
레일스 애플리케이션입니까? –