문제

오늘날 프로그래밍에서 볼 수있는 추상화 반전의 최악의 (유병률 또는 심각도로 인해)는 무엇입니까?

이 개념에 익숙하지 않은 사람들에게는 추상화 반전이 높은 수준의 구성물 위에 저수준 구성을 구현하고 있습니다. 보다 정확하게는 A와 B를 구성한다고 가정합니다. B는 A 위에 구현되었지만 A는 어디에도 노출되지 않습니다. 따라서 하위 레벨 구조 A가 실제로 필요한 경우 B가 A 측면에서 구현 될 때 B 위에 A를 구현하게됩니다. 보다 http://en.wikipedia.org/wiki/abstraction_inversion.

도움이 되었습니까?

해결책

아마도 내가 본 추상화 남용의 최악의 사례는 이 유창한 C#, 유창한 인터페이스에서 기본 유량 제어 요소 (IF, While, 시퀀싱 된 표현식)를 포장했습니다.

따라서 완벽하게 관용적이고 깨끗한 코드 :

var selectedTextBox = (TextBox)sender,
if (IsAdmin)
{
    selectedTextBox.Enabled = true;
    selectedTextBox.Text = superSecretPassword;
}
else
{ 
    selectedTextBox.Clear();
}

이 혼란이됩니다 :

Cast<TextBox>(sender).
    WithIf(IsAdmin,
        With(selectedTextBox => selectedTextBox.Enabled = true).
        With(selectedTextBox => selectedTextBox.Text = superSecretPassword),
        With(selectedTextBox => selectedTextBox.Clear());

람다에서 모든 것이 더 좋기 때문에!

다른 팁

이것은 꽤 죽은 주제처럼 보입니다. 토론을 시작하기 위해 내 질문에 대답하겠습니다. 내가 본 최악의 추상화 역전은 OOP 스타일의 초록 클래스/인터페이스를 사용하여 기능 포인터를 복제하는 것이라고 말하고 싶습니다. 예를 들어:

interface foo {
    int bar();
}

class myClass1 implements foo {
    // No member variables.

    int bar() {
        // Implementation
    }

    // No other methods.
}

class myClass2 implements foo {
    // No member variables.

    int bar() {
        // Implementation
    }

    // No other methods.
}

수업은 상태와 행동을 모두 캡슐화해야 할 때 강력한 추상화로 여겨집니다. 함수 포인터는 동작 만 포함하는 데 사용되는 비교적 간단한 것입니다. 가상 함수는 기능 포인터의 배열을 사용하여 구현되지만 많은 OO 언어는 기능 포인터 또는 직접적으로 동등한 것을 노출시키지 않습니다. 따라서 인터페이스 및 클래스를 사용하여 기능 포인터와 동등한 기능을 구현하며 이러한 클래스 및 인터페이스는 기능 포인터 측면에서 자체적으로 구현됩니다. 이것은 불필요한 복잡성과 성능 감소로 이어집니다.

이것이 당신의 질문에 대답하고 있는지 확실하지 않지만 LISP와 같은 멋진 고급 언어가 마치 마치 마치 마치 마치 마치 어셈블리 언어 인 것처럼 사용되는 것을 보았습니다. 그것이 프로그래머가 있던 수준입니다.

IMHO, 그것은 언어가 아무리 높은 수준이라도 보편적이라면 가장 낮은 수준에서 사용할 수 있다는 계산의 아이러니 중 하나입니다. 정교함은 정교함을 보장하지 않습니다.

SQL 결과 세트를 처리하기 위해 클라이언트 측 절차 컬렉션 라이브러리를 사용합니다.

플래그 부울 변수를 사용하여 구조 프로그래밍에서 GOTO를 시뮬레이션하는 것은 어떻습니까? 그러나 구조 프로그래밍은 일반적으로 받아 들여졌습니다. 이것이 추상화 반전이 항상 나쁜 것은 아니라는 것을 나타냅니다.

당신이 마음에 들지 않는다면 또 다른 대답이나 질문. "추상화"라는 단어에 실제로 정의가 있습니까? 추상화가 실제로 좋거나 나쁘거나 중립적입니까? 내 말은, 나는 2 개의 신발, 2 개의 눈, 2 사이클 등의 공통적 인 것을 의미하기 때문에 숫자 2가 추상적이라는 것을 이해합니다. 인터페이스 Istack은 스택과 같은 작용에 적용되기 때문에 추상적 일 수 있습니다. 그러나 서브 루틴 A가 Subroutine B에게 전화를 걸면 그것이 더 추상적이라는 것을 의미합니까? 우리는 왜이 단어에 매혹적입니까?

EDT : 사람들이 "콘크리트"문제에서 코를 켜는 것을 보았 기 때문에 묻는 것을 묻습니다. 숲이 나무보다 숲이 더 중요하다고 생각합니다.

이것이 실제로 자격이 있는지 확실하지 않지만 관련이있는 것 같습니다. SQL Server 2005가 CLR 기능을 제공했을 때, 나는 많은 개발자들이 "음, 이제 저장된 절차에서 직접 웹 서비스 호출을 해제 할 수 있습니다!"라고 말하는 것을 들었습니다. 나는 또한 이것을하는 것에 대한 몇 가지 튜토리얼을 보았다. 그것들은 상충되는 수준의 추상화 수준입니다.

오늘날 프로그래밍에서 볼 수있는 추상화 반전의 최악의 (유병률 또는 심각도로 인해)는 무엇입니까?

나는 이것이 계산되는지 모르겠지만, 나는 그들의 이름을 따서 명명 된 클래스를 볼 때 보통 불타고있다. 구현 대신에 그들이 무엇을위한 것. 그것은 정말로 일종의 헝가리 표기법입니다.

  • CustomerFactory
  • DecisionTreevisitor
  • AbstractWindowDecorator
  • JSONDATAADAPTER
  • tabbedDocumentImpl
  • Concretelisthandler

"공장", "방문자", "데코레이터", "어댑터", "임플란트", "콘크리트" - 누가 구현되는지, 무엇을 사용하는지에 대한 관심은 누구입니까?

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