Ruby (또는 다른 동적 언어)의 인터페이스 대신 무엇을 사용할 수 있습니까?


9

내 목표는 클래스 간 계약을 정의하는 것입니다.

오리 타이핑과 모든 것을 좋아하지만 외부에서 호출 할 메소드와 다른 레이어에서 사용해서는 안되는 액세서리 메소드를 명확하게 정의하기 위해 응용 프로그램의 다른 레이어간에 인터페이스를 정의하고 싶습니다 .

예를 들어 Java에서는 get () 및 save ()와 같은 메소드로 Persistor 인터페이스를 정의한 다음 데이터베이스에서 유지해야하는 모든 메소드로 JdbcPersistor 클래스를 정의 할 수 있습니다. 원격 restserver에 저장하기위한 다른 방법이있는 다른 RestPersistor 일 수도 있습니다.

루비에서 인터페이스를 요구하지 않습니다.이 구별을 유지하는 깔끔한 방법이 있는지 아는 것입니다. 나는 루비를 좋아하지만 작은 프로젝트에서만 일했습니다.


나는 이것이 StackOverflow에 속한다고 생각한다.
thorsten müller

2
@thorsten Stack Overflow는 특정 구현 문제를위한 것입니다 (즉, 코드에 문제가 있습니다). 일반적인 프로그램 디자인 질문은 Programmers.SE에 대한 주제입니다.

@ 마크 : 수정 해 주셔서 감사합니다. 나는 그것이 Ruby에 너무 구체적이라고 생각했습니다 (그리고 Uberto의 마지막 문장을 놓쳤습니다). 그래서 FAQ에 대한 지식을 업데이트했습니다. (여전히 내 길을 찾는 중)
Thorsten Müller

+1 훌륭한 질문입니다. 나는 많은 양의 문서를 읽고 읽고 최신 정보를 얻는 방법이나 밑줄이나 그와 비슷한 내부 액세서리 방법과 같은 구피 규칙을 사용하는 다른 방법이 있는지에 관심이 있습니다.
Joonas Pulakka

+1 그런데 PLT 라켓은 계약을 지원하며 역동적입니다. Ruby와 비슷한 것을 추가하는 것은 흥미로운 프로젝트입니다.
Larry Coleman

답변:


5

이것은 C # 인터페이스와 Ruby의 스택 오버 플로우에서 대답했습니다 : https : //.com/questions/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

요약 : 오리 타이핑은 공식적인 인터페이스가 불필요하기 때문에 Ruby에는 정확히 동등한 것이 없습니다. 대신 "인터페이스"또는 계약을 사용하여 계약 준수를 테스트하는 것을 고려하십시오 respond_to?.


2
네, 그러나 이것은 코드가 접근해서는 안되는 메소드에 접근하는 것을 막지 않습니다
Uberto

2

일부 동적 형식 언어에는 인터페이스 또는 유사한 개념이 있습니다. 예를 들어 Objective-C에는 프로토콜이 있습니다. 그러나 대부분은 그렇지 않습니다. 동적 언어에서 효과적이기 위해서는 정적 형식 언어에 대해 알고있는 것을 잊어 버리고 언어의 동적 특성을 수용해야합니다. 동적 유형 언어는 일반적으로 인터페이스 사용을 피합니다.


1

Perl 5에서 MooseMoo 는 특정 메소드의 구현이 필요한 역할 (또는 특성)을 제공합니다. Moose는 또한 duck_type필요한 메소드 세트를 가진 객체를 선언하는 유형 인 을 정의 할 수있는 런타임 유형 시스템과 함께 제공됩니다 .

역할은 클래스 (또는 다른 역할) 자체에 의해 구현되며 인터페이스뿐만 아니라 구현 및 동작도 제공합니다. 그러나 그들은 (적어도 Moose에서는) 메소드 충돌 감지와 같은 것을 처리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.