추상화 란 무엇입니까? [닫은]


38

프로그래머 가 사용 하는 프로그래밍 추상화 가 무엇인지에 대해 일반적으로 합의 된 정의 가 있습니까? [참고, 프로그래밍 추상화는 "추상"이라는 단어에 대한 사전 정의와 혼동되어서는 안됩니다.] 모호하지 않거나 심지어 수학적 정의가 있습니까? 추상화의 명확한 예는 무엇입니까?


.. 그리고 게시 할 때 로봇이 아님을 증명하도록 강요 당하면서 너무 많은 것을 요구하고 있음을 시사합니다 :)
mlvljr

8
수학적으로 무엇을 의미합니까? 저는 추상화를 수학적 개념으로 생각하지 않습니다.
Fishtoaster

2
@ mlvljr : 미안하지만 여전히 내가 확신하지 못합니다. 추상화는 무언가를 다루는 간단한 방법을 제공하는 관행입니다. 나는 공식적인 도구 / 방법이 그것과 어떤 관련이 있는지 알지 못한다.
Fishtoaster

1
@mlvljr, 모든 프로그래밍 추출을 다루는 수학 예제 또는 수학을 원하십니까? 나는 후자가 존재하지 않는다고 생각합니다.
C. Ross

8
Perhpas cstheory.stackexchange.com 이이 질문에 대한 올바른 장소입니다
Conrad Frix

답변:


46

"프로그래밍 추상화가 수학적으로 어느 정도 정의 될 수 있습니까?" "아니오"입니다. 추상화는 수학적 개념이 아닙니다. 누군가에게 레몬의 색을 수학적으로 설명하도록 요청하는 것과 같습니다.

좋은 정의를 원한다면 추상화는 특정 아이디어에서보다 일반적인 아이디어로 이동하는 프로세스입니다. 예를 들어, 마우스를보십시오. 무선인가요? 어떤 종류의 센서가 있습니까? 버튼이 몇 개입니까? 인체 공학적입니까? 얼마나 큽니까? 이 모든 질문에 대한 답변은 마우스를 정확하게 설명 할 수 있지만, 답변이 무엇이든 관계없이 버튼이있는 포인팅 장치이기 때문에 여전히 마우스입니다. 그것이 마우스가되기 위해 필요한 전부입니다. "Silver Logitech MX518"은 구체적이고 구체적인 항목이며 "mouse"는이를 추상화 한 것입니다. 생각해야 할 중요한 것은 "마우스"와 같은 구체적인 대상이 없으며 단지 아이디어 일뿐입니다. 책상 위의 마우스는 항상 더 구체적입니다.

추상화는 원하는대로 계층화하고 세밀하거나 거칠게 할 수 있습니다 (MX518은 마우스로, 포인팅 대상인 컴퓨터 주변기기, 전기로 작동되는 대상인 마우스), 원하는만큼 멀리 갈 수 있습니다. , 그리고 실제로 원하는 방향으로 (마우스에 와이어가 있습니다. 이는 와이어가있는 객체로 분류 할 수 있음을 의미합니다. 또한 바닥에 평평하므로 롤링되지 않는 객체의 종류로 분류 할 수 있습니다. 경 사진 평면에 똑바로 세웁니다).

객체 지향 프로그래밍은 추상화와 가족 또는 그룹 개념을 기반으로합니다. 좋은 OOP는 프로그램의 영역에서 의미가 있고 "누수되지 않는"적절한 세부 수준에서 좋은 추상화를 선택하는 것을 의미합니다. 전자는 경 사진 평면에 구르지 않는 객체로 마우스를 분류하는 것은 컴퓨터 장비를 발명하는 응용 프로그램에는 적합하지 않지만 물리 시뮬레이터에는 적합 할 수 있음을 의미합니다. 후자는 어떤 종류의 객체에는 적합하지 않은 계층 구조에 "자체를 박아 넣지"말아야한다는 것을 의미합니다. 예를 들어, 위의 계층에서 우리 모두가컴퓨터 주변 장치는 전기로 구동됩니까? 스타일러스는 어떻습니까? 스타일러스를 "주변"범주로 그룹화하려면 전기를 사용하지 않기 때문에 문제가 발생하며 컴퓨터 주변 장치를 전기를 사용하는 객체로 정의했습니다. 원 - 타원 문제는 이 수수께끼의 가장 알려진 예이다.


2
내 생각에 당신은 구체적으로 방법이나 함수를 추상적 인 방식으로 언급하는 것에 대해 이야기하고 있습니다. 귀하의 진술은 정확하며 이는이 용어를 완벽하게 유효하게 사용합니다. 메소드 호출은 일종의 구체적인 행동의 추상화입니다.
nlawalker

4
@ nlawalker : 추상화와 일반화를 혼합하고 있습니다. 그들은 같은 것이 아닙니다. 당신이 설명하는 것은 후자입니다 ( '특정 아이디어에서보다 일반적인 아이디어로 이동 '). 추상화는 콘크리트에서 추상적 인 것으로 이동합니다. 예를 들어 7 개의 파란색 및 7 개의 빨간색 대리석이 있고 '동일한 수의 동일한 색의 대리석이있는 두 세트가 있습니다'라고 말하고 있습니다. (클래스 및 동등한 세트). BTW에서, 자연수 n은 모든 등가 카디널리티 n의 세트의 클래스이며, 이들 세트 사이의 일대일 맵핑에 의해 정의 된 비 원형입니다.
pillmuncher

33
레몬의 색은 수학적으로 약 570nm의 파장을 가진 빛입니다.
Erik

1
@ 에릭 나는 그렇게 쓸거야. 바!
게리 로우

1
@Erik 수학이 아니라 물리학입니다. :) 수학은 "빛"과 같은 개념에 대해서는 아무것도 모릅니다. 빛은 경험적입니다. 수학은 아닙니다.
Andres F.

25

나는 대부분의 답변에 동의하지 않습니다.

이것은 내 대답입니다.

두 세트의 G와 H가 주어지면 Galois 연결 (알파, 베타) 이 그들 사이에 정의 될 수 있으며 하나는 다른 것의 구체화라고 할 수 있습니다. 연결을 되 돌리면 하나는 다른 하나의 추상화입니다. 함수는 concretization 함수와 추상화 함수입니다.

이것은 컴퓨터 프로그램의 추상적 해석 이론에서 비롯된 것으로, 현재까지 정적 분석 방식입니다.


8
OK, 당신은 :) professorism위한 골드 스타 얻을
마이크 Dunlavey

@ 마이크 : 예? :-)
Paul Nathan

아, 그리고 예가 있습니까?
mlvljr의

2
@mlvljr : di.ens.fr/~cousot/AI astree.ens.fr 은 데이터 스케치를 제공합니다.
Paul Nathan

1
아미르 : 정적 분석 세계의 추상화에 대한 기술적 정의입니다.
Paul Nathan

13

추상화는보다 집중 What되고 덜 집중 된다 How. 또는 필요한 것만 알고 다른 모든 서비스의 제공자를 신뢰하면됩니다. 때로는 서비스 제공 업체의 신원을 숨기기도합니다.

예를 들어,이 사이트는 질문 및 답변 시스템을 제공합니다. 여기의 거의 모든 사람들이이 사이트의 질문, 답변, 투표 및 기타 사항에 대한 절차를 알고 있습니다. 그러나 기본 기술이 무엇인지 아는 사람은 거의 없습니다. 사이트가 ASP.net mvc 또는 Python으로 개발되었는지 여부와 같이 Windows 또는 Linux 서버에서 실행되는지 여부와 같습니다. 이는 당사의 사업이 아니기 때문입니다. 따라서이 사이트는 서비스를 제공하는 기본 메커니즘 위에 추상화 계층을 유지하고 있습니다.

다른 예 :

  • 자동차는 모든 메커니즘을 숨기지 만 자동차를 운전하고 연료를 보급하고 소유자에게 유지하는 방법을 제공합니다.

  • 모든 API는 다른 프로그래머에게 서비스를 제공하는 모든 구현 세부 사항을 숨 깁니다.

  • OOP의 클래스는 공개 멤버를 호출하는 서비스를 제공하는 비공개 멤버 및 공개 멤버의 구현을 숨 깁니다.

  • Java 또는 C ++에서 Interface또는 의 유형의 객체를 사용하는 동안 abstract class실제 구현은 숨겨집니다. 그리고 숨겨져있을뿐만 아니라에 선언 된 메소드의 구현은 Interface구현 / 상속 된 클래스마다 다를 수 있습니다. 그러나 동일한 서비스를 받고 있으므로 서비스 How가 구현되고 정확하게 Who/ What서비스를 제공하는 데 신경 쓰지 마십시오 .

  • 신원 숨기기 : "샘은 컴퓨터 프로그램을 작성할 수 있다는 것을 알고 있습니다." 추상화는 "샘은 프로그래머입니다. 프로그래머는 컴퓨터 프로그램을 작성하는 방법을 알고 있습니다." 두 번째 진술에서 사람은 중요하지 않습니다. 그러나 그의 프로그래밍 능력이 중요합니다.


그렇다면 왜 "무엇의 정확한 사양"이라고 부르겠습니까?
mlvljr

satori 비트도 +1
mlvljr

@mlvljr 약간 How은 항상 Whats 를 이해하는 데 도움이됩니다 . 따라서 추상화와 혼합 될 수 있습니다.
Gulshan

7

프로그래밍 추상화는 문제 의 단순화 된 모델 입니다.

예를 들어, TCP / IP 연결은 데이터 전송에 대한 추상화입니다. IP 주소와 포트 번호 만 포함하여 API로 전송하십시오. 전선, 신호, 메시지 형식 및 장애에 대한 모든 세부 정보는 걱정하지 않아도됩니다.


아하! 여기서 단순화 된 모델 은 무엇입니까 ? 새는 퍼즐 기억 나 ? :)
mlvljr

7

추상화는 정리의 프로그래밍 버전 일뿐입니다.

당신은 공식적인 시스템을 가지고 있고, 그 시스템에 대한 생각을 제안합니다. 당신은 그것을 증명하고 그것이 잘 풀리면 정리가됩니다. 정리가 보유하고 있음을 알면 시스템에 대한 추가 증거로 사용할 수 있습니다. 시스템에서 제공하는 프리미티브 (if 문 및 int 값 유형과 같은)는 일반적으로 공리로 표시되지만 머신 코드로 작성된 CPU 명령어가 아닌 것은 일종의 추상화이므로 엄격하게 사실이 아닙니다.

함수형 프로그래밍에서 수학적 설명으로서의 프로그램 아이디어는 매우 강력하며, 종종 형식 시스템 (Haskell, F # 또는 OCAML과 같은 강력하고 정적으로 형식화 된 언어)은 증명을 통해 이론 성을 테스트하는 데 사용될 수 있습니다.

예를 들어 : 기본 연산으로 덧셈과 동등성 검사가 있고 기본 데이터 유형으로 정수와 부울이 있다고 가정 해 봅시다. 이것이 우리의 공리입니다. 그래서 우리는 그것이 1 + 3 == 2 + 2정리 라고 말할 수 있고 , 덧셈과 정수, 평등의 규칙을 사용하여 그것이 참된 진술인지 알아볼 수 있습니다 .

이제 우리가 곱셈을 원한다고 가정하고, 우리의 기본형 (간결함을 위해)에는 루핑 구조와 기호 참조를 할당하는 수단이 포함되어 있습니다. 우리는 제안 할 수

ref x (*) y := loop y times {x +}) 0

나는 그것을 증명하는 척하면서 곱셈이 유효 함을 보여줄 것이다. 이제 곱셈을 사용하여 시스템 (프로그래밍 언어)으로 더 많은 작업을 수행 할 수 있습니다.

타입 시스템도 확인할 수 있습니다. (*)는 int-> int-> int 유형입니다. 2 int를 취하고 int를 출력합니다. 더하기에는 int-> int-> int 유형이 있으므로 0 + (rest)는 (rest)가 int가되는 한 유지됩니다. 내 루프는 모든 종류의 작업을 수행 할 수 있지만 (x + (x + (x ... + 0)))가 결과와 같은 일련의 카레 함수를 출력한다고 말하고 있습니다. 추가 체인의 형태는 (int-> (int-> (int ...-> int)))이므로 최종 출력은 int 일 것입니다. 그래서 내 타입 시스템은 다른 증거의 결과를 견뎌냈습니다!

수년간, 많은 프로그래머 및 많은 코드 라인에서 이러한 종류의 아이디어를 복합적으로 사용하면 현대적인 프로그래밍 언어가 있습니다.


4

Wikipedia의 답변이 충분할까요? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

컴퓨터 과학에서 추상화의 메커니즘과 실습은 세부 사항을 줄이고 요소를 고려하여 한 번에 몇 가지 개념에 집중할 수 있습니다.


그렇다면 추상적 인 것의 예는 무엇입니까?
mlvljr

3
@mlvljr : wikipedia 기사를 읽으면 몇 가지를 볼 수 있습니다.
John Fisher

슬프게도, 나는 그들이 너무 추상적
것이라고 확신합니다

4

수학적으로 "정수"는 추상화입니다. 그리고 모든 정수에 대해 x + y = y + x와 같은 공식적인 증명을 할 때, 3이나 4와 같은 특정 숫자가 아닌 추상화 "정수"로 작업하고 있습니다. 레지스터와 메모리 위치보다 높은 레벨의 머신. 대부분의 경우 더 추상적 인 수준에서 더 강력한 생각을 할 수 있습니다.


사용하지 않음 IInt add(IInt a, IInt b);어디 프로그램에서 서브 루틴을 사전에 알고있는 것을 a하고 b있을 것이다,라고 Int128: IInt다소 좋은 예? 당신이 당신의 코드 조각이 알고 그것을 할 것입니다 (입증 할 수있는), 어떻게해야되는 일을 가지고 --ie 당신이 필요로하는 일을 하고 동시에 (그리고 다른 한편으로는) 당신이 만드는 그것을 할 정확하게 일이 그것을 알지 못하고 (다른 상황에서도 그 것을 사용할 수있는 능력을 가지고) 필요합니까?
mlvljr

1
죄송 합니다만 귀하의 질문을 이해할 수 없습니다.
Kate Gregory

2에서 3을 더해야하는 프로그램을 작성한다고 가정하십시오 add(int, int). 서브 루틴 / 함수를 호출하여이를 수행 합니다. return 2 + 3;이 경우 에만 있으면 충분합니다 . 그리고 왜 더 "보편적 인"루틴을 사용해야 하는가 ( return a + b;즉 , 제공된 실제 ab매개 변수로 작동 하고 따라서 값에서 실제로 추상화 됨 ) 위의 나의 (수사적) 질문이었습니다. 좀 더 명확 해 졌으면 좋겠다.
mlvljr의

나의 첫번째 의견은, 내가 :) 동의 꽤 "자기 - 난독 화"입니다
mlvljr

4

여기에 좋은 답변이 있습니다. 사람들은 추상화가 어떻게 든 받침대에 놓아야 할만 큼 멋진 것이라고 생각하고 충분히 얻을 수 없다고 생각합니다. 그렇지 않습니다. 그냥 상식입니다. 사물 간의 유사점을 인식하기 만하면 문제 해결 방법을 다양한 문제에 적용 할 수 있습니다.

나를 허락 해줘 ...

사람들이 "추상화 계층"을 말하는 것처럼 그것이 좋은 일이라고 말할 때 나의 성가심 목록에서 가장 높다. 그들은 그들이 좋아하지 않는 수업이나 루틴 주위에 "래퍼"를 만들고, 그것들을 더 좋게 만드는 것처럼 "더 추상적"이라고 부릅니다. "공주와 완두콩"의 우화를 기억하십니까? 공주는 너무 섬세해서 매트리스 아래에 완두콩이 있으면 잠을 잘 수 없었고 매트리스 층을 더 추가해도 도움이되지 않았습니다. 더 많은 "추상화"레이어를 추가하는 것이 도움이된다는 아이디어는 일반적으로 그렇지 않습니다. 이는 기본 엔터티에 대한 모든 변경 사항이 여러 계층의 코드를 통해 파급되어야 함을 의미합니다.


"명확하게 인식하기에는 너무 아름답거나 (더 많은 경우, 건조한 (수학적) 용어로 설명하기에는") 추상적이라고 생각하는 것은 그것이 무엇인지 이해하는 데 도움이되지 않으며 (두 번째로) 응용 프로그램 및 (공포!) 평가 [주어진 코드가 어떻게 그리고 어떤 방식으로 추상적인가]
mlvljr

3
한 곳에서 변경하면 다른 곳에서 여러 번 변경해야한다면 추상화가 잘못되었습니다. 본질적으로, 나는 나 또는 다른 사람이 너무 많은 추상화 측면에서 실수를 한 적이 없다고 말하지는 않지만 그 광기에 대한 방법이 있습니다. 좋은 추상화는 느슨하게 결합 된 코드의 초석입니다. 올바른 추상화가 주어지면 변경은 엄청나게 간단 해집니다. 예, 받침대에 추상화를 적용하고 올바른 것을 찾는 데 많은 시간을 소비합니다.
Jason Baker

@ 제이슨 베이커하자 우리의 추상화 기술은 효과적으로 사용하는 콘크리트 충분 ...
mlvljr

1
@Jason : "한 곳에서 변경하면 다른 곳에서 여러 번 변경해야한다면 추상화가 잘못되었습니다." 나는 당신과 함께 있습니다. 나는 나쁜 사람들에 둘러싸여있는 것 같습니다.
Mike Dunlavey

1
개발자들이 웅대 한 비전을 가지고있는 곳에서 일한 것처럼 들리며 팀을 집중시키는 데 강한 보스가 없었습니다. 그런 환경에서 저를 찾으면 다른 일자리를 찾기 시작합니다 (프로젝트 예산은 항상 끝나거나 회사 규모가 작거나 파산). 최근에 '스파게티 코드'와 '라자냐 코드'의 트윗을 보았습니다. 후자는 너무 많은 레이어가있을 때입니다.
yzorg

4

누출 추상화에 대한 블로그 게시물이 유용 하다고 생각 합니다. 관련 배경은 다음과 같습니다.

추상화 는 관련된 프로그램 조각들 사이에서 공통적 인 것을 취하고, 차이점을 제거하며, 프로그래머가 그 추상 개념을 나타내는 구조로 직접 작업 할 수 있도록하는 메커니즘입니다. 이 새로운 구성은 (가상적으로) 항상 매개 변수화를 가지고 있습니다 : 즉, 특정 요구에 맞게 구성 사용을 사용자 정의하는 수단입니다.

예를 들어, List클래스는 연결 목록 구현의 세부 사항을 추상화 할 수 있습니다. 조작 nextprevious포인터의 관점에서 생각하는 대신 시퀀스에 값을 추가하거나 제거하는 수준을 생각할 수 있습니다. 추상화는 훨씬 더 작은 기본 개념에서 유용하고 풍부하며 때로는 복잡한 기능을 만드는 데 필수적인 도구입니다.

추상화는 캡슐화 및 모듈화와 관련이 있으며 이러한 개념은 종종 오해됩니다.

List예에서는 캡슐화 를 사용하여 연결된 목록의 구현 세부 정보를 숨길 수 있습니다. 예를 들어 객체 지향 언어에서 nextprevious포인터를 비공개로 만들 수 있습니다 . 여기서 List 구현 만 이러한 필드에 액세스 할 수 있습니다.

캡슐화는 구조에 대한 새로운 개념이나 다른 개념을 반드시 의미하지는 않기 때문에 추상화에 충분하지 않습니다. 모든 List클래스가 ' getNext'/ ' setNext'스타일 접근 자 메소드를 제공했다면 구현 세부 정보에서 캡슐화됩니다 (예 : 필드 이름을 ' prev'또는 ' previous'? 정적 유형은 무엇입니까?). 추상화 수준이 매우 낮습니다.

모듈화정보 숨기기 와 관련이 있습니다 . 안정적인 속성은 인터페이스에 지정되며 모듈은 해당 인터페이스를 구현하여 모든 구현 세부 정보를 모듈 내에 유지합니다. 다른 모듈은 안정적인 인터페이스에만 의존하기 때문에 모듈성은 프로그래머가 변화에 대처하는 데 도움이됩니다.

정보 숨김은 캡슐화를 통해 지원되므로 (코드가 불안정한 구현 세부 사항에 의존하지 않음) 모듈화에는 캡슐화가 필요하지 않습니다. 예를 들어, 당신은 구현할 수 List'노출, C의 구조 next'와 ' prev세계'포인터뿐만 아니라 인터페이스를 제공, 포함 initList(), addToList()removeFromList()기능. 인터페이스 규칙을 준수하면 데이터 구조가 항상 유효한 상태인지 확인하는 등 특정 속성이 항상 유지되도록 보장 할 수 있습니다. 예를 들어, 모듈성에 관한 Parnas의 고전 논문은 조립의 예를 사용하여 작성되었습니다. 인터페이스는 설계에 관한 계약이자 의사 소통의 형태이며, 오늘날 우리가 의존하고 있지만 반드시 기계적으로 점검 할 필요는 없습니다.]

추상, 모듈 및 캡슐화와 같은 용어가 긍정적 인 설계 설명으로 사용되지만 이러한 품질이 존재한다고해서 자동으로 우수한 설계를 제공하지는 않는다는 점을 인식해야합니다.

  • n ^ 3 알고리즘이 "멋지게 캡슐화"되어 있으면 개선 된 n log n 알고리즘보다 여전히 성능이 떨어집니다.

  • 인터페이스가 특정 운영 체제를 커밋하는 경우 비디오 게임을 Windows에서 iPad로 이식해야 할 때 모듈 형 설계의 이점은 실현되지 않습니다.

  • 생성 된 추상화가 너무 많은 필수 세부 사항을 노출하는 경우 자체 조작으로 새 구성을 작성하는 데 실패합니다. 동일한 이름의 다른 이름 일뿐입니다.


글쎄, 그것은 내가 실제로 원하는 것에 관한 것 같습니다 ( "modular == abstract == good == you-can-never-est-est-it-just-struggle"view의 일부 상식 / 예제로 증명 된 "랜트") , 감사 (계속 읽기)
mlvljr

) 그리고 여기에 "마음이 약한 얻을 때 추상화가 누출 된"(내 자신의 질문에) 내 곧 대답에서 도발적인 모토
mlvljr

2

좋아, 나는 당신이 요구하는 것을 알아 냈다고 생각합니다. "수학적으로 '초기화'에 대한 수학적으로 엄격한 정의는 무엇입니까?"

그렇다면 운이 나쁘다고 생각합니다. '추상'은 소프트웨어 아키텍처 / 디자인 용어이며 내가 아는 한 수학적 근거가 없습니다. 여기에서) "커플 링"또는 "정보 숨기기"이상의 수학적 정의가 있습니다.


2

추상화는 관련이있는 것으로 간주하여 관련이없는 것으로 간주되는 세부 사항을 무시할 때입니다.

추상화에는 캡슐화, 정보 숨기기 및 일반화가 포함됩니다. 유추, 은유 또는 휴리스틱을 포함하지 않습니다.

추상화 개념에 대한 모든 수학적 형식은 그 자체 추상화가 될 것입니다 . 왜냐하면 근본적인 것을 일련의 수학적 속성으로 추상화해야하기 때문입니다! 형태론 의 범주 이론 개념 은 아마도 당신이 찾고있는 것에 가장 가깝습니다.

추상화는 당신이 있다는 것을, 당신은 선언하는 것이 아닙니다 .


+1, "추상화합니다!" morphism (s)에 대한 링크를 주셔서 감사합니다. (여기 언급 한 수십 개의 폴리 - 폴리머를 직접 언급하지는 않지만 ))
mlvljr

2

다른 사람에게 설명하는 방법으로 나는 다른 결과를 얻을 수 있습니다.

컴퓨터 프로그래밍의 추상화는 하나 이상의 유사한 것이 일반적으로 동일하게 취급되고 동일하게 처리 될 수 있다는 점까지 무언가를 일반화하는 행위입니다.

당신이 그것을 확장하려면 다음을 추가 할 수 있습니다 :

때로는 반복적 인 코드를 미리 줄이기 위해 다형성 동작 (인터페이스 및 상속)을 달성하기 위해 수행되는 경우가 있습니다. 추상화 된 컨테이너 또는 래퍼의 다른쪽에 코드를 작성하여 향후 재 작업을 줄이십시오.

그 외에도 예제로 시작해야한다고 생각합니다 ...


1

Bob Martin의 일부 통계를 확인하고 싶을 수도 있습니다.

http://en.wikipedia.org/wiki/Software_package_metrics

나는 그의 "추상성"이 당신의 것과 동일하다고 생각하지 않습니다. 그는 인터페이스 / 추상 클래스의 사용을 의미하는 "클래스에서의 구현 부족"의 척도입니다. 메인 시퀀스로부터의 불안정성과 거리는 아마도 당신이 찾고있는 것에 더 많은 역할을 할 것입니다.


그래, 그 종이 기억해 Bob 아저씨는 군중에게 활력을 불어 넣고 사람들이 OO의 역학에 관심을 갖도록하는 데 훌륭합니다.
mlvljr

이상하게도, 나는 :) (한 번에) 찬성 투표하는 것을 잊었다
mlvljr

1

Merriam-webster는 abstract를 형용사로 정의합니다. 특정 인스턴스와 관련이 없습니다.

추상화는 일부 시스템의 모델입니다. 실제 시스템이 추상화에 의해 모델링 될 수 있도록 충족해야하는 가정 그룹을 나열하는 경우가 많으며 점점 복잡 해지는 시스템을 개념화하는 데 종종 사용됩니다. 실제 시스템에서 추상화로 이동하는 데는 공식적인 수학적 방법이 없습니다. 그것은 추상화를 정의하는 사람과 추상화의 목적이 무엇인지에 달려 있습니다.

종종 추상화는 수학적 구성의 관점에서 정의됩니다. 과학과 공학에 자주 사용되기 때문일 수 있습니다.

예를 들어 뉴턴 역학이 있습니다. 모든 것이 무한히 작고 모든 에너지가 보존된다고 가정합니다. 객체 간의 상호 작용은 수학 공식으로 명확하게 정의됩니다. 아시다시피, 우주는 그렇게 작동하지 않으며 많은 상황에서 추상화가 누출됩니다. 그러나 많은 상황에서 잘 작동합니다.

또 다른 추상 모델은 일반적인 선형 회로 요소, 저항, 커패시터 및 인덕터입니다. 다시 상호 작용은 수학 공식으로 명확하게 정의됩니다. 저주파 회로 또는 간단한 릴레이 드라이버 및 기타 사항의 경우 RLC 분석이 잘 작동하고 매우 좋은 결과를 제공합니다. 그러나 마이크로파 무선 회로와 같은 다른 상황에서는 요소가 너무 크고 상호 작용이 더 미세하며 간단한 RLC 추상화가 유지되지 않습니다. 이 시점에서해야 할 일은 엔지니어의 판단에 달려 있습니다. 일부 엔지니어들은 다른 엔지니어들과 함께 또 다른 추상화를 만들었으며, 일부는 이상적인 연산 증폭기를 작동 방식에 대한 새로운 수학 공식으로 대체하고, 일부는 이상적인 연산 증폭기를 시뮬레이션 된 실제 연산 증폭기로 대체하여 더 작은 복잡한 네트워크로 시뮬레이션합니다. 이상적인 요소.

다른 사람들이 말했듯이, 그것은 단순화 된 모델입니다. 복잡한 시스템을 더 잘 이해하는 데 사용되는 도구입니다.


나는 아마도 이것을 더 잘 강조했을 것이지만, 실제 프로토 타입에 대한 불필요한 세부 사항이 부족한 추상화에 관심이 없지만 위에서 언급 한 실제 객체를 다루는 시스템 디자인에 대한 유용한 힌트를 제공합니다. (예는 비즈니스 응용 프로그램에 유용 할 수있는 실제 직원 속성이있는 Employee 클래스를 구성하는 것입니다). 내가 관심이있는 것은 소프트웨어 엔티티를 처리하는 다른 엔티티로부터 소프트웨어 엔티티를 "벽화"하는 일종의 추상화입니다 (예는 Employer가정입니다 Employee).
mlvljr

1
당신은 말이되지 않습니다. 실제 시스템 설계에 대한 힌트를 제공하는 것은 추상화의 목적이 아닙니다. 모델링 대상에 대해 아무것도 모르는 경우 추상화가 해결하는 데 문제가되지 않습니다.
whatsisname

소프트웨어를 만드는 과정에서 소프트웨어가 다루는 실제 객체의 세부 사항을 추상화하는 것에 대해 이야기했습니다. 실세계 개체의 (소프트웨어) 추상화를 사용하여 실세계가 의도하지 않은 것을 (재) 디자인합니다 ( "소프트웨어 시스템"은 "시스템"으로 "그러나 시스템 디자인에 대한 힌트를 제공합니다") 위의 내 의견).
mlvljr

1

추상화는 무언가 (예 : 개념, 데이터 구조, 함수)를 다른 것으로 표현합니다. 예를 들어 의사 소통을 위해 단어를 사용합니다. 단어는 소리 (음성) 또는 그래픽 기호 (쓰기)로 표현할 수있는 추상 항목입니다. 추상화의 핵심 아이디어는 문제의 실체가 그 단어를 발음하는 데 사용되는 소리 나 글을 쓰는 데 사용되는 글자가 아닌 것처럼 기본 표현과 구별된다는 것입니다.

따라서 적어도 이론적으로 추상화의 기본 표현은 다른 표현으로 대체 될 수 있습니다. 그러나 실제로 추상화는 기본 표현과 완전히 구별되는 경우가 거의 없으며 " 누설 " 표현도 있습니다. 예를 들어, 연설은 감정적으로 표현 된 내용을 담고 있으며, 글로 표현하기가 매우 어렵습니다. 이 때문에 동일한 단어의 오디오 녹음 및 대화 내용은 청중에게 매우 다른 영향을 줄 수 있습니다. 다시 말해서 단어의 추상화가 종종 누출됩니다.

추상화는 일반적으로 레이어로 제공됩니다. 단어는 글자로 표현 될 수있는 추상화이며, 차례로 소리의 추상화입니다. 이는 차례로 성대에 의해 생성되고 귀 드럼에 의해 감지되는 공기 입자의 운동 패턴의 추상화입니다. .

컴퓨터 과학에서 비트는 일반적으로 가장 낮은 표현 수준입니다. 바이트, 메모리 위치, 어셈블리 명령어 및 CPU 레지스터는 다음 단계의 추상화입니다. 그런 다음 바이트, 메모리 위치 및 어셈블리 명령어로 구현되는 고급 언어의 기본 데이터 형식과 명령어가 있습니다. 그런 다음 기본 데이터 유형의 측면에서 구현되고 언어 명령어로 작성된 함수 및 클래스 (OO 언어 가정). 그러면 더 복잡한 함수와 클래스가 더 간단한 함수로 구현됩니다. 이러한 함수 및 클래스 중 일부는 목록, 스택, 대기열 등과 같은 데이터 구조를 구현합니다. 차례로 프로세스 대기열, 직원 목록 또는 해시 테이블 제목과 같은보다 구체적인 엔티티를 나타내는 데 사용됩니다. .


1
새는 경우 분명히 추상화가 아닙니다 ... 충분히 정직하게합시다.
mlvljr

2
@mlvljr 컴퓨터는 슬프게도 수학 문제가 아니므로 어느 정도의 누출이 허용되어야합니다. 다른 방법이 없다면 실제 장치에서 계산이 수행된다는 사실은 모델링 할 수있는 문제 범위에 대한 특정 제약 조건을 의미합니다. 기술적으로 불완전 성 정리는 내부적으로 수학 시스템에 대해 어떤 것이 증명 될 수 없다는 것을 암시하므로 수학조차도 "누출 된 추상화"를 가지고 있습니다.
CodexArcanum

2
추상화가 유출되는 상황을 항상 찾을 수 있습니다. 완벽한 추상화와 같은 것은 없습니다. 누수량과 함께 살 수 있는지 여부는 단순히 문제입니다.
Dima

@CodexArcanum 1. int(MAX_INT_SIZE / 2-1)보다 작고 두 배나 더 큰 것을 반환 하는 루틴 : int f(int a) { return a*2; }2. void (*) (void)... uhmm에 따라 호출되어야 하는 프로토 타입 이 있는 "handler" 발신자의 계약은 둘 다 추상화 (1-구현 세부 사항 (우리가 제공했지만 소스 코드에 액세스 할 수없는 사용자는 액세스 할 수 없음)에 대한 세부 사항), 2-- 정확히 처리기 (하지만 처리기를 지정한 사람에게 알려짐) 누출되지 않음
mlvljr

MAX_INT_SIZE의 제약은 메소드 서명의 어느 곳에서도 명확하지 않습니다. 에펠 탑과 같은 계약 기반 프로그래밍을 허용하는 언어를 사용하지 않으면 누출입니다. 설명서가 시스템 외부에 있기 때문에 설명서에 언급 된 제한 사항은 포함되지 않습니다. 작업 중에 전원이 꺼지면 어떻게해야합니까? 네트워크를 통해 데이터를 전송해야하고 대기 시간이있는 경우 어떻게해야합니까? 어떤 프로그래밍 패러다임도 시스템 하드웨어의 물리적 특성을 추상화 할 수 없습니다.
CodexArcanum

1

사람들에게 설명하려는 한 가지 방법은 최선의 방법이 아닐 수도 있습니다

2 + 2를 더하고 4를 출력하는 프로그램을 생각해보십시오.

사용자가 입력 한 두 개의 숫자 x + y = z를 추가하는 프로그램을 생각해보십시오.

더 유용하고 일반적인 것은 무엇입니까?


그것이 Kate Gregory의 대답에 대한 나의 의견과 거의 같습니다. ;) 흥미로운 점은 덜 일반적인 프로그램이 더 일반적인 프로그램을 활용할 수 있지만, 첫 번째를 요청한 사용자에게 아마도 두 번째로 유용한 정보를 제공하는 것입니다.
mlvljr

1

추상화는 불필요한 세부 사항을 숨기는 것이라고 주장합니다. 가장 기본적인 추상화 단위 중 하나는 절차입니다. 예를 들어, 파일에서 데이터를 읽을 때 데이터베이스에 데이터를 저장하는 방법에 대해 걱정하고 싶지 않습니다. 그래서 save_to_database 함수를 만듭니다.

더 큰 추상화를 형성하기 위해 추상화를 결합 할 수도 있습니다. 예를 들어, 함수는 클래스로 구성 될 수 있고, 클래스는 프로그램을 구성하기 위해 결합 될 수 있으며, 프로그램은 분산 시스템을 형성하기 위해 결합 될 수 있습니다.


코드 호출 save_to_database필요한 구현을 선택했기 때문에 데이터가 정확히 저장되는 방법에 대해 걱정하지 않아도 됩니다 ! 즉, 어쨌든 (일부 코드 조각에 대한 "상대적인"요약 된) 세부 정보를 제공 할 수있는 장소가있을 것입니다. 이는 쉽게 "마음의 변화"를 제공하는 등 신중하게 선택하는 문제입니다.
mlvljr

1

저는 항상 프로그래밍의 추상화를 세부 사항을 숨기고 단순화 된 인터페이스를 제공하는 것으로 생각합니다. 프로그래머가 기념비적 인 작업을 관리 가능한 부분으로 나눌 수있는 주된 이유입니다. 추상화를 사용하면 모든 세부 사항을 포함하여 문제의 일부에 대한 솔루션을 만든 다음 솔루션을 사용할 수있는 간단한 인터페이스를 제공 할 수 있습니다. 그러면 세부 사항에 대해 "잊어 버릴"수 있습니다. 이것은 매우 복잡한 시스템의 모든 세부 사항을 한 번에 마음에 담을 수있는 방법이 없기 때문에 중요합니다. 이것은 추상화 아래의 세부 사항을 다시 방문 할 필요는 없지만 당분간 인터페이스 만 기억해야한다는 것을 말하는 것은 아닙니다.

프로그래밍에서이 단순화 된 인터페이스는 변수 (비트 그룹을 추출하고 더 간단한 수학적 인터페이스를 제공함)에서 함수 (한 줄의 처리량을 단일 회선 호출로 추출)부터 클래스 이상까지 모든 것이 될 수 있습니다.

결국 프로그래머의 주요 임무는 일반적으로 모든 계산 세부 사항을 추상화하고 컴퓨터 작동 방식에 대해 한 가지 모르는 사람이 GUI와 같은 간단한 인터페이스를 제공하는 것입니다.

추상화의 장점 중 일부는 다음과 같습니다.

  • 큰 문제를 관리하기 쉬운 부분으로 나눌 수 있습니다. 데이터베이스에 개인의 레코드를 추가 할 때 데이터베이스에 인덱스 트리를 삽입하고 균형을 유지하기 위해 고민하지 않아도됩니다. 이 작업은 어느 시점에서 완료되었을 수 있지만 이제는 추상화되어 더 이상 걱정할 필요가 없습니다.

  • 여러 사람이 프로젝트를 함께 잘 수행 할 수 있습니다. 동료 코드의 모든 정보를 알고 싶지 않습니다. 사용 방법, 기능 및 작업 (인터페이스)과 함께 사용하는 방법을 알고 싶습니다.

  • 필요한 지식이없는 사람들이 복잡한 작업을 수행 할 수 있습니다. 우리 엄마는 그녀의 페이스 북을 업데이트 할 수 있고, 그녀는 전국에서 알고있는 사람들이 그것을 볼 수 있습니다. 단순한 웹 인터페이스에 대한 복잡한 시스템을 추상화하지 않고는 비슷한 작업을 시작할 수있는 방법이 없습니다.

그러나 추상화는 과도하게 사용하는 경우 관리하기가 쉽지 않은 역효과를 가져올 수 있습니다. 문제를 너무 작은 조각으로 나누면 기억해야 할 인터페이스의 수가 증가하고 실제로 무슨 일이 일어나고 있는지 이해하기가 더 어려워집니다. 대부분의 것들과 마찬가지로 균형을 찾아야합니다.


1

추가적인 수준의 간접 지향.

사용하는 객체가 a Cat인지 또는 a 인지 상관하지 않으므로 Dog가상 함수 테이블을 통해 올바른 makeNoise()함수 를 찾으십시오 .

주어진 프로세서 또는 하스켈의 사용에 대한 권리 지시를 찾고 컴파일러의 생각 - 나는 확실히이 '낮은'잘으로 '높은'수준으로 적용 할 수있어 Monad의 모든 것을 호출하여 이상 전산 효과 추상화 return>>=.


1

이것은 실제로 더 오랫동안 블로그를 만들고 싶었지만 결코 얻지 못했습니다. 운 좋게도 나는 대표 좀비이며 현상금도 있습니다. 내 게시물이 다소 길다는 것이 밝혀 졌지만 여기에 핵심이 있습니다.

프로그래밍의 추상화는 주어진 맥락 내에서 객체의 본질을 이해하는 것입니다.

[...]

추상화는 일반화뿐만 아니라 캡슐화로 오인 될뿐 아니라 정보의 두 직교 부분은 숨겨져 있습니다. 캡슐화는 첫 번째 부분이며 추상화는 후자입니다. 둘 다 함께 만 완전한 정보를 숨길 수 있습니다.

희망이 도움이됩니다.


+1, 그렇습니다. 그 주제는 우리 중 많은 사람들을 몹시 괴롭히는 것 같습니다.
mlvljr

0

수학적인 답은 다음과 같습니다.

프로그래밍에서 빠져 나가는 것은 현재 세부 사항에 신경 쓰지 않는 반면, 실제로는 항상 관심을 기울여야합니다. 기본적으로 척입니다.


1
+1, 그러나 항상 그렇게 생각하는 것은 아닙니다 (정말 불필요한 세부 사항을 생각하십시오 :) 초기 질문은 "세부 사항을 영구적으로 제거하여 일시적으로 잊어 버리거나 모르는 방식으로 활용하는 것입니까?"입니다.
mlvljr

1
오늘날 고객에게 몇 개의 광자가 충돌했는지는 중요하지 않습니다.
flamingpenguin

0

저에게 추상화는 "문자 그대로"존재하지 않는 아이디어입니다. 수학적으로 표현하면 수학이 뇌에서 일어나는 일을 표현하는 언어이기 때문에 더 이상 추상적이지 않습니다. 다른 사람의 뇌가 이해할 수 있기 때문에 아이디어를 구조화 할 수 없습니다. 더 이상 : 아이디어 모델을 표현하기 위해 뇌가 어떻게 작용하는지 이해해야합니다.

추상화는 현실을 독립 할 수있는 것으로 해석 할 수있게하는 것입니다. 해변과 꿈을 추상화 할 수 있지만 해변은 존재하지만 꿈은 그렇지 않습니다. 그러나 둘 다 존재한다고 말할 수는 있지만 사실이 아닙니다.

추상화에서 가장 어려운 것은 그것을 표현하는 방법을 찾아 다른 사람들이 그것을 이해하여 현실로 바꿀 수 있도록하는 것입니다. 그것은 가장 힘든 일이며 실제로 혼자서는 할 수 없습니다. 아이디어에 효과가 있고 다른 사람이 이해할 수있는 상대 모델을 고안해야합니다.

나에게 컴퓨터 언어의 추상화는 모델을 "수학적으로 표현하는"이름이어야하며, 의사 소통 할 수있는 아이디어를 재사용하는 것과 관련이 있으며, 추상적으로 달성 할 수있는 것에 비해 엄청난 제약이 따른다.

간단히 말해서 원자는 서로 옆에 있지만 신경 쓰지 않습니다. 인간으로 조직 된 많은 분자들은 그가 누군가 옆에 있다는 것을 이해할 수 있지만, 어떻게 원자가 어떻게 자신을 어떤 패턴으로 위치 시켰는지 이해할 수는 없습니다.

개념에 의해 지배되는 하나의 대상은 일반적으로 "이해할 수 없다". 그래서 우리는 신을 믿으려고 노력하고 뇌를 이해하는데 어려움을 겪습니다.

지금 메달을받을 수 있습니까?


0

흥미로운 질문입니다. 나는 프로그래밍과 관련하여 권위있는 것으로 간주되는 추상화의 단일 정의를 모른다. 다른 사람들은 CS 이론이나 수학의 다양한 분야에서 일부 정의에 대한 링크를 제공했지만; "supervenience"와 비슷한 방식으로 생각하고 싶습니다. http://en.wikipedia.org/wiki/Supervenience

프로그래밍의 추상화에 대해 이야기 할 때, 본질적으로 시스템에 대한 두 가지 설명을 비교합니다. 코드는 프로그램에 대한 설명입니다. 코드의 추상화는 해당 프로그램에 대한 설명이지만 "더 높은"수준입니다. 물론 원래 추상화에 대해 더 높은 수준의 추상화를 가질 수 있습니다 (예 : 높은 수준의 시스템 아키텍처의 프로그램 설명과 자세한 디자인의 프로그램 설명).

이제 한 설명을 다른 설명보다 "높은 수준"으로 만드는 것은 무엇입니까? 핵심은 "복수의 실현 가능성"입니다. 프로그램의 추상화는 여러 언어로 여러 가지 방법으로 실현 될 수 있습니다. 이제 하나의 프로그램에 대해 여러 개의 디자인을 만들 수 있다고 말할 수도 있습니다. 두 사람이 프로그램을 정확하게 설명하는 두 개의 다른 고급 디자인을 만들 수 있습니다. 실현의 동등성은 차이를 만듭니다.

프로그램이나 디자인을 비교할 때는 해당 레벨에서 설명의 주요 속성을 식별 할 수있는 방식으로 그렇게해야합니다. 디자인이 다른 디자인과 동일하다고 말하는 복잡한 방법으로 들어갈 수 있지만 가장 생각하는 방법은 이것입니다. 단일 바이너리 프로그램이 두 설명의 제약 조건을 만족시킬 수 있습니까?

그렇다면 한 수준의 설명이 다른 수준보다 높은 이유는 무엇입니까? 설명 레벨 A (예 : 설계 문서)와 설명 B 레벨 (예 : 소스 코드)이 있다고 가정 해 봅시다. A1과 A2가 레벨 A에서 두 개의 동일하지 않은 설명 인 경우, A1과 B2의 설명 은 레벨 B에서 동일하지 않아야 하기 때문에 A가 B보다 높은 레벨입니다 . .

따라서 두 개의 서로 다른 디자인 문서를 충족하는 단일 바이너리 프로그램을 생성 할 수없는 경우 (즉, 해당 디자인의 제약 조건이 서로 상충 될 수 있음), 해당 디자인을 구현하는 소스 코드는 달라야합니다. 그러나 다른 한편으로, 동일한 바이너리 프로그램으로 컴파일 할 수없는 두 세트의 소스 코드를 가져와도 두 세트의 소스 코드를 컴파일하여 생성 된 바이너리가 동일한 디자인을 만족시키는 경우가있을 수 있습니다 문서. 따라서 디자인 문서는 소스 코드의 "추상"입니다.


0

프로그래밍 추상화는 프로그래밍 요소에서 누군가가 만든 추상화입니다. 항목과 물건으로 메뉴를 작성하는 방법을 알려줍니다. 그런 다음 누군가 그 코드 조각을보고 생각했습니다. 이것은 다른 종류의 고용 구조와 같은 구조에 유용 할 수 있으며 구성 요소 디자인 패턴을 정의한 것은 첫 번째 코드 조각의 추상화입니다.

객체 지향 디자인 패턴은 추상화의 좋은 예이며, 실제 구현을 의미하지는 않지만 솔루션에 접근 해야하는 방식을 의미합니다.

요약하자면, 프로그래밍 추상화는 문제를 이해할 수있는 접근법입니다. 무언가를 얻는 수단이지만 실제로는 그렇지 않습니다.

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