구조적 프로그래밍과 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.