암시 적 및 명시 적 용어는 처음들을 때 익숙해집니다. 당신이 프로그래밍의 관점에서 그들을들을 때 그것이 당신에게 정확히 무엇을 의미합니까? 한 가지 방법이 다른 방법보다 낫습니까? 여기서 우리는 이러한 각각의 아이디어를 제공 예를 일부 디자인 패턴을 하는 혜택을에서 올 수 있습니다.
용어
에서 프로그래밍,암시적이 나타나기 위하여 자주 사용하는 뭔가가 당신을 위해 수행하여 다른 코드고 있습니다., 명시 적 명시 적으로 수행 할 지침을 작성하여 갖고 싶은 변화를 달성하기위한 수동 접근 방식입니다. 더 작은 그림에서 암시 적 및 명시 적 은 종종 당신이 그것을 가질 유형에 유형을 캐스팅하는 데 사용되는 용어입니다. 더 큰 그림에서,당신은 당신에 대해 이야기 할 수있 협약을 통해 구성 규칙은 무엇인가 암시적으로 수행을 위해 당신에 코드 또는 기본 프레임워크 및 구성은 단순히 명시적인 설정합니다.,
이에 차이가 있의 적합성이나 혜택을 사용하거나 프로그래밍 언어에 따라 질문에는지 여부와 언어가 입력한 정적으로 또는 동적으로 입력한다. 또한 런타임 또는 컴파일 중에 사물을 추론 할 수 있는지 여부에 따라 다릅니다. 기 때문에,이러한 요소를 만드는 클레임을 제기하는 하나의 방법보다 더 나은 다른만 가능하게 될 사실에 좁은 상황을 고려하는 디자인을 위한 프로그래밍 언어와 프로그램에서 질문입니다.,
의 예를 암시적이고 명시적인 유형 주물 C 은 다음과 같습니다:
int implicit;implicit = 4.5;int explicit;explicit = (int)4.5;
여기에는 변수 이름을implicit
및explicit
정의된 형식으로int
. 일단 값을 지정4.5
암시 버전을 컴파일러 변환 어떤 것은 일반적으로 부유물 혹은 더블 형식을 정수를 반면 명시적으 버전은 명시적으로 캐스팅 정수의 사용으로(int)
는 무엇을 캐스팅하는 유형입니다.,
정적으로 입력한 언어
에 정적으로 형식 언어와 같은 녹는 대부분의 가치 창출 및 할당 명시적인 형식 주석을 사용하여 요구사항에 대한 예외 어디에 있든 컴파일러를 추정할 수 있다. 다음은 Rust 에서 명시 적 및 암시 적 유형을 보여주는 예입니다.
fn add_one(input: u8) -> u8 { input + 1}let four = add_one(3);
여기에서는 방법을add_one
이에 대해 명시적 입력 입력 및 출력 형식입니다., 수1
추가되 여기는 암시적으로 만든u8
번호에서 컴파일 시 컨텍스트로는 데 도움이 형식을 유추고 또한u8
만 구현되어 함께 작동하는u8
숫자입니다. 마지막 줄은 메서드 자체가 반환 될 형식을 정의하기 때문에 암시 적으로u8
로 입력됩니다.
녹에서 유추 할 수있는 것은 제네릭의 사용으로 꽤 인상적입니다. 그러나 추론의 사용은 컴파일 타임에 알 수있는 것들로 제한됩니다., 컴파일 타임에 알 수없는 경우 지정 시점에 명시 적으로 유형을 정의해야합니다. 다음과 같은 방법을 정의
use std::ops::Add;fn add_both<T: Add>(a: T, b: T) -> T::Output { a + b}
여기에는T
될 수 있는 모든 유형을 구현하는 특성을Add
. T::Output
입력된 경우 이 추가 특성에 대해 정의된 특정 유형은 일반적으로 동일한 유형으로T
에서 자신 경우입니다. 이제 두 개의 숫자를 매개 변수로 제공하면 컴파일러가 유형을 추론 할 것입니다.,
let x = add_both(3 , 4 ); // implicit typelet y: u8 = add_both(3u8 , 4u8 ); // explicit typelet z: u32 = add_both(3u32, 4u32); // explicit type
실행할 때 위의 코드x
유추하는 유형i32
. y
및z
예력이 필요 매개변수 유형을 알려진에 제공할 경우 기능으로 추정한T::Output
지 않는 반드시 같은 무엇으로도 유추하기로 한다. 그것은 기본적으로i32
그 다음에 할당하는i32
로u8
또는u32
은 완전히 잘못된 것입니다.,
동적으로 입력한 언어
이와 동적으로 입력한 언어야에 대한 걱정을 덜 형식,per se,에 대한 자세한 암시적 또는 명시적 객체 또는 동작입니다. 모델 코드의 주위에있는 개체를 같은 동작은 무엇으로 알려진 오리가 입력되는 높은 도메인의 생각에 객체-지향 프로그래밍 어디에 처리하는 개체는 암시적입니다. 반면 특정 객체 클래스 주변의 코드를 모델링하는 것은 명시 적 또는 암시 적 타이핑을 사용하는 것과 훨씬 비슷합니다., 그러나 때 당신은 어떠한 종류의 개체를 입력으로,다음의 코드는 해당 섹션이나 핸들을 다른 개체로 명시적으로 또는 손으로 그 책임을 벗습니다.
명확히하기 위해 다른 종류의 것을 처리하기 위해 코드를 작성할 때 명시 적 코드를 작성하는 것입니다. 그러나이 동일한 코드가 이미 작성되었고 간단한 메소드 호출로 재사용 할 때,이 새로운 컨텍스트에서의 동작은 암시 적입니다. 암시적인 것은 마치 자동으로 수행되고 현재 범위 밖에서 처리됩니다.,
루비에서 대부분의 유형은 명시 적 또는 암시 적 변환을위한 디자인을 가지고 있습니다. 아이디어가 암시적 변환 방법을 사용하는 의미에서 묵시적 컨텍스트가 명시적 변환을 의미가 있 개발자가 작성하는 인라인에서 훨씬 더 많은 듯하다. 이것을 예를 통해 보여 드리겠습니다.
# explicit"4".to_i + "5".to_i# => 9# implicitclass Seven def to_int 7 endendArray.new(Seven.new)# =>
여기서 명시적인 예는것은 매우 분명 리더는 우리를 변환하는String
체를Integer
체 및 공연한 두., 고 암시적 예상치 않은 리더로Array.new
방법을 암시적으로 호출 to_int 방법에는 무엇이든 매개변수 그것은 주어집니다. 정수 클래스에는 단순히 self 를 반환하는 각 인스턴스에 정의 된 메소드 to_int 가 있습니다. 당신이42.to_int
를 쓰면 단순히42
를 되 돌리면됩니다. 메서드 호출에 대한 입력 가드로 암시 적 변환을 사용하는이 사용은 설계 상 유형 안전을위한 훌륭한 설계입니다. 여기에to_int
를 정의하지 않는 잘못된 종류의 객체를 입력으로 제공하면 어떻게됩니까?,
Array.new("32")# TypeError (no implicit conversion of String into Integer)
뿐만 아니라 그것은 실패하지만 그것은 우리에게 도움이 되는 메시지가 암시적 변환을 시도되었고 알려줍니다 클래스의 객체에 주어진 클래스의 객체을 기대합니다. Ruby 의 암시 적 변환 방법은이 객체가 실제로 당신이 기대하는 것이라고 말하는 방법입니다. 그리고 명시 적 변환은 단순히 예상되는 유형으로의 변환을 만드는 것입니다.
Ruby 는 많은 핵심 객체에 대해 암시 적 및 명시 적 옵션을 가지고 있습니다.,
루비에는 또한 몇 가지는 클래스 클래스와는 방법 중 하는 암시적으로 변환 또는 반품 전무는 방법 이름은try_convert
.
우리가 따를 수 있습니다 루비의 예Array.new
고 좋은에 대한 보호의 종류를 입력 매개 변수는 우리에 의해 주어진 디자인 암시적 변환을 위해 우리 자신의 사용자 정의 형식입니다. 이 예를 들어,이후to_f
은 명시적으로 변환을 떠 수 루비에서 우리가 사용하는as_
으로 접두사를 대신to_
., 다음은 안전을위한 패턴으로서의 암시성에 대한 기본 예입니다.
이제 도움이 될 것 다른 개발자가 사용하는Bar
등을 통과하지 않는것으로 호환되지 않는 매개 변수입니다. 그것은 루비 언어 내에서 규칙을 따르고 개발자가 더 도움이되는 오류로 이해하는 것이 훨씬 쉬워야합니다. 이 있을 때 다른 객체를 변환로 Foo 객체는 다음을 정의할 수 있는as_f
방법에 대해 명시적 변환을 사용하는 개발자는 새로운 객체를 명시적인 사용에Bar.new(Baz.new.as_f)
., 이를 통해 코드에서 작동합니다 그래서 많은Bar
및Foo
은 이미 노력하고 있습니다.
요약
의 행위를 암시적이고 명시적인 코딩 및 암시적이고 명시적인 코드에 의해 정의의 컨텍스트의 실행을 추가적인 동작이나 설정을 입력/캐스팅. 특히 암시 적 또는 명시 적 메소드는 사용하려는 컨텍스트에 의해 정의됩니다. 암시 적 코드는 사물을 단순하게 유지하는 것처럼 사물이 잘 명명되면 아주 좋은 경험이 될 수 있습니다.,
그러나 암시적 코드,코드의 일을 뒤에 당신을,또한 어려운 문제를 해결하는 완료되면 잘못입니다. 코드는 명시적 코드를 명확한 당신이 그것을 볼 때로의 세부 사항 수행되는 무엇이 이미 배치하기 전에 당신과 당신지가 문제를 추적하는 다른 곳에,그러나 일반적으로 많은 의미가 더 작업에 쓰기. 그 자체로는 압도적이 될 수 있으므로 둘 사이의 적절한 균형을 찾는 것이 종종 최선의 해결책입니다. 해야 할 때 명시 적이어야하며 디자인 및 이름 지정 개념이 이해하기 쉬운 경우 암시 적이어야합니다., 그것은 더 편리한 개발 경험을 만들 것입니다. 피>