구조적 프로그래밍과 OO 프로그래밍


11

구조적 프로그래밍과 객체 지향 프로그래밍의 차이점을 보여주는 프레젠테이션을 만들고 있는데 OOP 개념을 적용하면 코딩이 훨씬 쉬워 져 청중이 실제로 OOP가 필요하다고 느끼는 예를 통해 사람들이 OOP가 필요한 이유 를 설명하고자합니다 .

어떤 아이디어 ??


2
programmers.stackexchange.com 에서이 질문을하면 더 많은 답변을 얻을 수 있습니다.
— reggie

2
청중은 무엇입니까? 비 OO 프로그래머 (코볼 등) 경험이 있습니까? 경험이 적은 프로그래머 (학생 등)? 경영진 (비 프로그래머)?

나는 그것에 대해 전에는 듣지 못했지만 FAQ를 읽고 거기에 묻는 것이 더 낫습니다.
— Ahmed

낮은 경험.
— Ahmed

4
일부 OO 프로그램이 더 잘 구성되기를 바랍니다.
— Scott Whitlock

답변:


17

이 빠른 비디오 블로그를 보러 갈 수 있습니다 . 결론은 구조적 프로그래밍과 OO 프로그래밍의 차이점은 추가하는 것이 아니라 프로그래밍에서 빼앗는 것의 문제라는 것입니다. 구조적 프로그래밍 및 객체 지향 프로그래밍과 같은 소프트웨어 분야는 제한적이며 활성화되지 않습니다. 다음은 몇 가지 정의입니다. 경고 : 당신은 그들을 좋아하지 않을 것입니다.

  • 구조화 된 프로그래밍은 goto (직접 제어의 이전)에 부과되는 규율입니다.

  • OO 프로그래밍은 함수에 대한 포인터에 부과되는 규율 (간접 제어 전달)

  • 기능 프로그래밍은 할당시 부과됩니다.

    첫 번째는 이해하기 어렵지 않습니다. Dijkstra는 알고리즘에서 goto가 허용 될 때 일반적인 정확성 증명을 작성하는 것이 불가능하다는 것을 발견했습니다. 제어 구조는 시퀀스 선택 및 반복 한정 하였다 그러나 만약, 다음의 정확성 증거가 있었다 가능. 물론 오늘날 우리는 올바른 것을 증명하려고하지 않지만 구조화 된 프로그래밍의 단순함과 우아함을 좋아합니다.

OO를 이해하는 것이 조금 더 어렵습니다. 우리는 종종 OO를 캡슐화, 상속 및 다형성으로 정의합니다. 무엇을 알고 작은 것은 이러한 특성의 세 가지를 모두 달성 할 수있다, 자주 있다는 것이다 되었다 그것은 C로 캡슐화 하드 사실이 아니다 C. 아래로 컴파일도 아니다 빌드로 어려운 것으로, 실제로 C에 불과 전처리로 시작 C ++를 달성 서로의 하위 집합 인 데이터 구조로 상속을 시뮬레이션합니다. 그러나 다형성은 조금 더 어렵다. C에서는 잘 관리하기 어려운 함수에 대한 포인터가 필요합니다. C ++과 같은 언어가 우리에게 준 언어는 함수에 대한 포인터에 부과 된 규칙이었습니다. C ++ 컴파일러는 우리를 위해 vtable을 만들고 엄격한 형식에 따라 포인터를 초기화했습니다. 매우 실제적인 의미에서 OO는 단순히 징계를받습니다.제어의 간접적 인 전달, 즉 함수에 대한 포인터.

구조적 프로그래밍은 goto를 사용 하지 않는 방법에 관한 것 입니다. OO는 함수에 대한 포인터를 사용 하지 않는 방법에 관한 것입니다. 그리고 함수형 프로그래밍 역시 해야 할 일이 아닙니다 . 함수형 프로그래밍에서는 가장 엄격하게 제어되는 경우를 제외하고 변수를 할당하지 않습니다.

결국, 이러한 모든 프로그래밍 "기술"은 실제로 기술을 가능하게하는 것이 아니라 훈련을 제한합니다. 그들은 무엇을 우리에게 이야기 하지 더 그들이 무엇을 우리에게보다해야 할 않습니다. 이는 지난 40 년 동안 소프트웨어 개발이 성장하지 않았 음을 의미합니다. 오히려 줄어들었다. 우리 가하지 말아야 할 모든 것을 배웠 으므로 더욱 제약을 받습니다.

하지 말아야 할 것을 배우는 것이 좋습니다. 하지만 여기에 방해 질문입니다 : 새로운 것을 우리가 배운 것을 할 수 있습니까?


@Ahmed : "TL; DR, 비디오 주셔서 감사합니다"에 +1 의심스러운 의견 (
— kidding

링크 썩음 ... dead link
— slashdottir

7

컴퓨터를 프로그래밍하는 기본 방법에는 3 가지가 있습니다.

  1. goto구식 BASIC 인터프리터 또는 어셈블리 언어와 같은 s를 사용한 비정형 프로그래밍 더 이상 이런 방식으로 프로그래밍하는 사람은 거의 없습니다.
  2. C 또는 PASCAL과 같은 구조적 명령 프로그래밍
  3. Haskell, ML 또는 Lisp와 같은 구조적 기능 프로그래밍

내 생각에 객체 지향 프로그래밍은 다르다. 프로그램을 더 큰 규모로 구성하는 방법에 관한 것입니다. 위에서 언급 한 3 가지 패러다임을 대체하거나 폐기하지 않습니다. 메서드 본문 내에서 목록에서 3 개의 패러다임 중 하나를 선택해야합니다.


나는 당신을 잘 이해하지 못합니다! 당신은 우리가 3 가지 패러다임 중 하나를 사용해야한다는 것을 의미하지만 우리는 모른다.
— Ahmed

구조적 명령형 프로그래밍 또는 구조적 기능 프로그래밍을 배우지 않고서는 프로그래밍 할 수 없습니다. 이 두 패러다임은 일을 끝내는 것입니다. 반면에 OOP는 프로그램이 특정 크기에 도달 한 후에 만 ​​실행되는 프로그램 모듈화에 관한 것입니다. 항상 프로그래밍 할 때 사용하는 라이브러리에 분명히 나타나지만 Haskell, LISP 또는 Standard ML의 클래스 라이브러리와 같은 상속과 같은 OO 기능이없는 완벽한 클래스 라이브러리를 가질 수 있습니다.
— Ken Bloom

4

변화를 예상하는 방법에 관한 것입니다.

두 개념 모두 재사용 가능성에 적합하지만, OOP는보다 쉬운 변경을위한 문을 엽니 다. OOP는 Structural Programming의 재사용 가능성을 모두 갖추고 있지만이를 사용하면 적은 노력으로 새로운 기능을 만들 수 있습니다.

OOP는 상속의 추가 기능으로 구조 프로그래밍의 모든 기능을 상속한다고 말할 수 있습니다! :-디


나는 지금의 상속을 좋아하지 않습니다.

4
나도 아니지만 정부가 내 할아버지를 연금에서 쫓아 냈기 때문이다. 그러나 OOP 측면에서 상속은 꽤 잘되었습니다.
— corsiKa

내 경험상 OOP에서는 상속을 피하는 것이 가장 좋습니다. 실제로 인터페이스와 달리 얼마나 자주 슈퍼 클래스를 구축합니까? 일반적으로 구성을 선호하십시오.
— Janx

1
@Janx : "인터페이스와 달리 얼마나 자주 슈퍼 클래스를 구축합니까?" 응? 당신은 "수퍼 클래스를 만들지"않는다; 당신은 그들로부터 기존의 클래스와 빌드 subclasss을, 당신은 어떻게 그 모든 시간을. 상속을 사용하지 않으면 Liskov 대체 및 다형성의 이점을 얻지 못하므로 처음에 객체 지향 프로그래밍에서 무엇을하고 있습니까? 컴포지션은 다른 사용 사례를 가진 다른 도구이며 상속을 대체하지 않습니다. 당신은 서로를 "우선"해서는 안됩니다. 당신은 그들이 유용한 것에 각각을 사용해야합니다.
— 메이슨 휠러

1
@Mason-(Liskov 대체 원칙의) Barbara Liskov가 실제로 상속을 좋아하지 않는다고 (긴 비디오) 말 했음을 주목할 가치가 있습니다.
— Aidan Cully

2

개념은 직교입니다. 구조화 된 프로그래밍은 프로 시저 / 함수 / 방법 내에서 코드를 구성하는 것입니다. OOP를 수행 할 때 클래스 메소드 내에서 구조화 된 프로그래밍 원칙을 따르는 것이 완벽하고 가능합니다.


1

그것은 일종의 주관적인 표현입니다. 구조적 프로그래밍과 OOP는 문제를 해결하는 스타일이며 하나는 항상 다른 것보다 낫지는 않습니다. 입력 데이터에 대해 변환을 수행하는 구조화 된 스타일로 수행하면 수치 분석법 라이브러리를 작성하는 것이 좋습니다. 그러나 상태 머신으로 구동되는 간단한 에이전트는 Java 또는 C ++에서 자체 포함 클래스로 쉽게 표현할 수 있습니다. OOP는 데이터 구조를위한 스토리지 컨테이너를 표현하는 자연스러운 방법입니다.

정보 숨기기 및 모듈화에 대해 이야기하는 것은 OOP를 스타일로 자연스럽게 동기를 부여하는 좋은 방법입니다.

이 문제에 대한 흥미로운 설명은 Steve Yegge 가 작성했습니다 . 두 가지 스타일의 접근 방식의 차이점에 대한 더 나은 설명 중 하나입니다.


0

비즈니스 모델을 만들 때 OOP를 이해하기가 더 쉽습니다. 응용 프로그램의 요소에 대해 생각할 때 책과 저자, 제목, ISBN과 같은 일부 개체와 관계를 사용하십시오. 책은 도서관에 두어야하며 학생이 빌릴 수 있습니다. 구조적 프로그래밍은 특정 프로세스, 추상화가 아닌 구현에 대한 사고를 강요합니다.

OOP는 쉽게 변경할 수 있도록 설계되었습니다. 구조적 프로그램의 변경이 가능하지만 코드로 설명해야합니다. OO 프로그램의 변경은 추상적 모델 변경으로 설명 할 수 있습니다.


0

변수 범위 :

좋은 프로그래밍을 보장하는 언어의 원칙은 변수의 범위 를 제한 하는 것이라고 생각 합니다. C와 같은 구조화 된 언어에서 범위는 주로 두 가지 유형입니다.

  • 글로벌 범위
  • 지역 / 기능 / 방법 범위

우리 모두는 세계적인 범위가 해롭다는 것을 알고 있습니다. 그러나 때로는 로컬 범위로는 프로그램을 실행하기에 충분하지 않습니다. 전역 범위를 피하면 포인터를 더 광범위하게 사용하는 경향이있어 범위 밖의 변수를 사용할 수 있습니다. 그러나 포인터는 이해하고 사용하기가 어렵습니다.

C ++과 같은 OOP 언어는 캡슐화를 통해 새로운 유형의 범위- 클래스 / 객체 범위 를 추가합니다. 이 범위는 개인 / 공개 변형에 의해 더욱 향상됩니다. 그리고 이것은 가변 범위 지정의 많은 문제를 해결합니다. 범위는 OOP에서 더 정의됩니다. 그리고 포인터가 덜 필요합니다.

이것은 OOP의 가장 큰 특징 중 하나입니다.

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