객체 지향 프로그래밍을 배우기 전에 왜 절차 적 프로그래밍을 배워야 하는가?


10

저는 지금 IT 대학교에서 4 학년이되어이 주제에 관해 교수와 이야기 할 때 저의 의견을 거부하고 매우 큰 비판을받습니다. C ++ (2 학년 OOP 수업) 및 기타 전에 대학교 1 학년 프로그래밍 클래스 ...

그러나 13 세의 나이에, 나의 형제는 Java에 의해 먼저 가르쳐졌으며 다른 것은 없습니다. 이제 그는 정상적인 2 학년 학생이 Java로 할 수있는 거의 모든 것을 할 수 있습니다.

전문가에게 절차 절차 프로그래밍을 먼저 배워야한다고 생각하는 이유를 알고 싶습니다.


8
어셈블러에는 객체가 없기 때문입니다.

9
계산기 사용법을 배우기 전에 제대로 계산하도록 가르쳐야하는 이유와 같습니다.

22
객체 지향 디자인에 결함이 있기 때문입니다. 프로그램은 데이터에서 작동하는 동작의 모음입니다. 객체는 종종 불필요한 복잡성을 초래합니다. "프로그램 설계 방법 : 프로그래밍 및 컴퓨팅 소개"를 읽으십시오.

8
다른 누군가가 말했듯이 " OPP를 가진 새로운 프로그래머를 산만하게하지 마십시오": prog21.dadgum.com/93.html- 기본적으로 OOP가 새로운 프로그래머에게 기본 사항을 가르치는 데 방해가되는 모든 것. 당신은 그들에게 두 가지 정말 어려운 개념을 동시에 가르치고 있습니다.
존 리플리

7
@juxstapose-객체 지향 프로그래밍이 불필요한 복잡성을 초래한다고 말하는 것은 단일 강철 블록에서 차량을 조각해야한다고 말하는 것과 같습니다. 그냥 내 의견.

답변:


23

빠른 요약 :

  1. 현실에서는 조만간 절차 코드로 작업해야하기 때문입니다.

  2. 절차 언어는 대안이 아닌 확장 또는 객체 지향 언어에 대한 소개처럼 작동 할 수 있기 때문입니다.

  3. 대답 2를 보충하십시오. OOP는 절차 적 프로그래밍보다 복잡하기 때문에 먼저 절차 적 프로그래밍을 배우는 것이 좋습니다.

  4. 실제 세계에서는 프로그래머가 단일 패러다임이 아니라 AKA "다중 패러다임 프로그래밍"문제를 해결하기 위해 여러 가지 방법으로 작업하고 결합하기 때문입니다.

  5. 대부분의 프로그래밍 언어는 디자이너 나 일반 개발자가 반대라고해도 어느 정도 수준의 다중 패러다임입니다.

  6. [신규] 절차 적 프로그래밍과 혼동되고 혼동되는 모듈 식 프로그래밍을 OOP에 적용 할 수 있으므로 "객체 지향 프로그래밍을 배우기 전에 왜 모듈 식 프로그래밍을 배워야합니까?"라는 질문을 읽을 수 있습니다.

확장 보링 설명 :

포인트 1은 추가 설명이 아닌 매우 명확합니다.

포인트 2, 클래스, 상속, 다형성, 인터페이스 등

Point 3, Object Oriented Pascal을 배우기 전에 Procedural Pascal을 코딩했습니다. 거기에 도착했을 때 저는 "클래스는 작은 절차 적 프로그램과 같습니다 ... ... 그리고 서로 대화 할 수 있습니다. ".

나는 평범한 C에서 C 플러스 플러스로 갔던 사람들로부터 같은 말을 들었습니다.

포인트 4, 대부분의 프로그래머는 여러 프로그래밍 기술 또는 패러다임 또는 문제 해결 방법을 결합합니다. 기능적, 절차 적, OOP, 논리적.

Java "Pure OO"조차도 평범한 객체 프로그래밍이 아닙니다.

"구조 프로그래밍"대신 "프로 시저 프로그래밍"이라고 말하는 +1 포인트. 또는 모듈 식 프로그래밍. 이것들이 중요합니다.

많은 경우에,이 용어들은 여러 번 가르치고 상호 교환 적으로 사용되지만 그렇지 않습니다. 구조적 프로그래밍 (Structured Programming)은 단지 절차를 사용하는 것이 아니라 많은 개념을 포함하며 그 중 하나는 "스파게티 코드"처럼 보이지 않도록 프로그램을 만드는 것입니다.

오늘 저는 "객체 지향 스파게티 코드"처럼 보이는 "순수한"OO 프로그램을 몇 개 읽었습니다. 이는 프로그래머가 OOP를 사용했지만 코드가 엉망인 것 같습니다.

여러 번 OO 코드를 읽고 프로그래머가 OOP 전에 구조적 프로그래밍을 배웠다고 말할 수 있습니다. 코드가 명확하고 정렬되어 있기 때문입니다.

그리고 모듈 식 프로그래밍의 경우 여러 앱을 보았습니다. 모듈을 사용하지 않는 C ++ 및 PHP


18

저는 그 비유가 수학과 비슷하다고 생각합니다. 몇 가지 기본 개념을 먼저 배우고 (더하기 / 빼기 / ...) 더 복잡한 주제 (대수 / 미적분)로 넘어가십시오. 절차 적 프로그램은 매우 선형 적이며 구문을 배우는 동안 제어 흐름을 파악하기가 더 쉽습니다. OOP는 아마도 더 복잡하다고 생각되며 절차 언어에서 사용되는 더 간단한 구성을 기반으로하지만 더 추상적이고 이해하기는 어렵습니다. C와 같은 언어로 시작하면 하드웨어에 더 가까워지고 메모리 할당 및 포인터 문제를 해결할 수 있습니다.이 문제는 이해해야하지만 Java / C #과 같은 언어에서는 실제로 사용하지는 않습니다. 학교의 첫 번째 또는 두 번째 여부에 관계없이 학교에 노출되는 것이 실제로 가치가 있습니다.

FWIW, 결국에는 바뀔 것입니다. 학교를 시작할 때 우리는 파스칼과 PL / 1에서 배웠습니다. 우리는 고급 언어 수업 (날짜로)까지 C에 도착하지 않았습니다. 대학원 때까지 Java를 선택하지 않았습니다. 아직 발명되지 않았습니다!


+

10
@Spacemoses-실제로 추상적 인 것이 아니라 토론이 쉬워 지지만 논의되는 내용의 현실을 파악하기가 더 어려워집니다.

동의했다, 지금 당신의 요점을 참조하십시오.
ses011

12

객체 지향 프로그래밍은 체계적인 방식으로 절차 적 스 니펫 모음입니다. 여러분이 배우고있는 교훈은 객체 지향 방법론이 조직 및 유지 관리 성을 유지하는 데 도움이된다는 것입니다. 이 구분을 할 수없고 프로그램이 더 절차적일 때 프로그램이 객체 지향적이라고 주장하는 많은 프로그래머가 있습니다.


3
그러나 functions + state = objects
Dan D.

4
객체 지향은 종종 코드베이스를 부풀리기 때문에 유지 관리를 훨씬 어렵게 만듭니다. Java 기반 시스템은 해당 커뮤니티에서 발견되는 OO 순도 및 디자인 패턴 염 수준으로 인해 유지해야 할 악몽입니다.
bit-twiddler

1
"해당 커뮤니티에서 발견 된 디자인 패턴"- "자바 커뮤니티"에서 개인적인 문제인 것 같습니다.
ses011

1
@Dan D : 오브젝트 배향 ... 많은 개체에서 기능과 결합 된 상태를보다
마잔 Venema의

4
@Spacemoses : KISS 원칙을 따르지 않는 개발 커뮤니티에 문제가 있습니다. 문제에 대한 가장 좋은 해결책은 종종 가장 간단한 해결책입니다.
bit-twiddler

11

당신은하지 않습니다.

Scheme을 통해 기능 프로그래밍을 먼저 배웠습니다 . 그런 다음 우리는 절차로 이동 한 후 OOP, 그리고 다음 선언적 프로그래밍. 그리고 믿거 나 말거나, 이미 프로그래밍을 알고 있지만 다른 사람들도 실제로 더 쉽다고 생각합니다. FP는 수학과 같습니다! 그래서 당신은 이미 기본을 알고 있습니다.

나는 이것을 여러 번 나 자신과 토론했으며, 궁극적으로 그것이 당신의 교사가 당신에게 개념 을 얼마나 잘 가르치는가에 달려 있다는 결론에 도달했습니다 .

다음과 같은 이유로 단일 답변이 없습니다.

  • 컴퓨터가 실제로 어떻게 작동하는지 배우기 때문에 C (또는 어셈블리)와 같은 절차로 시작하는 것이 좋습니다.

  • 객체 지향 Java로 시작하면 OOP를 배우고 적용하기가 비교적 쉽고 ** 형성에 대해 가르치기 때문에 좋은 선택이 될 수 있습니다.

  • Scheme과 같은 기능적 프로그래밍으로 시작하면 변수 대신 함수 측면에서보다 추상적으로 생각하는 법을 배우므로 궁극적으로 더 나은 프로그래머가 될 수 있습니다.

선생님이 잘 가르치지 않는다면, 무엇을 시작하든 상관 없습니다. 그들은 거의 똑같이 밝혀 질 것입니다.


4
+1 쾅하고 나는 그것을 찾기 위해 너무 많은 가난한 대답을 스크롤해야한다고 믿을 수 없다!
jk.

실제로 수학 함수를 이해하는 데 어려움이 있었기 때문에 먼저 코딩을 배웠으며 '일을하는 것'대신 '있는'기능의 개념이 당황했습니다. : 3
StarWeaver

6

언어는 C ++, Java 또는 C #과 같은 객체 지향적 일 수 있습니다. 그리고이 언어로 시작할 수 있습니다. 그러나 요점은 이러한 OO 언어에서도 절차 적 프로그래밍을 먼저 배우고 나서 OOP를 배워야한다는 것입니다. 당신도 당신 형제에게도 마찬가지라고 생각합니다.


3
정확하게 +1 모든 OOP 방법은 짧은 절차 프로그램입니다. 당신은 작은 조각 (유형, 리터럴 값, 변수, 연산자, 결합하는 방법을 모르는 경우 =할당 if, for더 큰 조각 (방법)에, 등), 당신이 이제까지 희망 할 수있는 방법 OOP를 이해합니다. 대부분의 기술과 마찬가지로, 매우 똑똑하고 동기가 부여되며 일대일 교육을받을 수 있으면 여러 관련 주제를 동시에 배울 수 있습니다.
David Harkness

3

적어도 C와 같은 언어로 된 절차 적 프로그래밍은 프로그래밍과 알고리즘, 데이터 구조, 인간이 이해할 수있는 소스 코드와 어셈블리 코드 사이의 행복한 매개체 인 추상화 수준으로 프로그래밍을 제거합니다.

이런 방식으로 학생들은 약간의 과학 (알고리즘, 데이터 구조)과 약간의 공학 (소스-> 객체-> 기계 컴파일, 폰-뉴만 (아마도) 아키텍처)을 동시에 배울 수 있습니다.

C ++ / obj-C를 통한 OOP는 코드 구성 패턴을 도입했습니다. 이는 코드를 하나 더 배울 것입니다. 이로 인해 위의 개념을 배우기가 다소 어려워 질 수 있습니다.

Java를 통한 OOP (다른 것들 중에서도)는 하드웨어와 환경을 추상화함으로써 더욱 발전합니다. 이제 기본 제품은 기계 코드가 아니지만 기본 하드웨어의 작동 방식을 밝히지 않는 일종의 중개자이지만 그 결과 학생이 코드 구성 패턴에 집중할 수있게됩니다.

결국 하드웨어가 어떻게 작동하는지 배우거나 코드 구성 패턴을 배우는 것이 절충안이라고 생각합니다. 어느 것이 더 중요한지, 나는 정말로 모른다. 현실 세계는 적어도 어느 정도의 지식이 필요합니다.

저 수준의 절차 적 프로그래밍으로 시작하는 학부 프로그램은 컴퓨터 과학자 / 컴퓨터 엔지니어를 생산할 가능성이 높으며 높은 수준의 개념으로 시작하는 프로그램은 소프트웨어 엔지니어 / 개발자 / 프로그래머를 생성한다고 생각합니다.


3

OOP 객체의 내장은 절차 적 프로그래밍으로 구성됩니다.

for 루프를 수행 할 수 없다면 포인터를 올바르게 사용하고 클래스와 인터페이스를 작성할 수없는 유형과 함수를 선언하십시오.

어쨌든 입문 수업에서 OOP를 배우지 않을 것입니다. 구문 일뿐입니다 .OOP로 바로 뛰어 들면 이미 처음보다 이해하기가 더 복잡해집니다.

OOP는 클래스를 구성하는 구문을 선언하는 것이 아니라 데이터 구조, 디자인 패턴, 다형성, 상속 및 구성에 관한 것입니다.

C에서 쉽게 수행 할 수있는 절차 적 프로그래밍에 필요한 모든 것을 수행 하려면 C로 배우는 대부분의 모든 것을 Java 또는 C ++로 가져올 수 있습니다. C, BUT에서 당연한 것으로 생각한 것을 다시 생각해야 할 수도 있습니다. ... 문장을 작성하고 (인터페이스를 정의하는 절차를 작성해야 함) 단락 (데이터 구조를 알고 있어야 함)을 이해 한 다음 일부 디자인 패턴 (비극, 코미디, 결함)을 알아야하는 문법 (입문 C) 완전한 소설 (완전 OOP 시스템)을 작성하기 전에 영웅, 그들이 상호 작용하는 방식 및 사용하지 않을 때).

내가 당신이라면 C 프로그래밍 언어 , 자바 프로그래밍 언어 , 디자인 패턴 , Gang of FourPattern Hatching 책을 집어 들었습니다 . C / C ++에 대해 진지한 경우 C 프로그래밍 언어 의 사본을 확실히 선택합니다 .

Java로 가고 싶다면 (그리고 $를 위해) id는 Java 디자인 패턴에 관한 서적과 Apache 및 Tomcat 웹 서버와 함께 Java를 사용하는 방법 및 SQL 데이터베이스 프로그래밍에 관한 서적을 사용하는 방법을 선택합니다. Java는 웹에서 너무 많은 엉덩이를 차고 있습니다. 죄송합니다. PHP에는 수많은 보안 취약점이있어 Windows가 서버를 뿌리 내리거나 SQL 데이터베이스를 주입하는 것을 막기 위해 Windows만큼 엉덩이를 아프게합니다.

SQL, Oracle MySQL Postgresql 및 MSSQL은 구문에 대해 공통점이 많지만 GPL 대신 BSD 라이센스이기 때문에 ID를 직접 선택해야합니다 .Postgresql을 선택해야합니다 (비교를 찾아야합니다) GPL / BSD 라이센스와 대조)


2

Java와 같은 객체 지향 언어로 작성된 대부분의 코드는 실제로 객체 지향이 아니라고 말할 수 있습니다. OO의 아이디어는 실제로 이해하기 어렵습니다. 결과적으로 OO 코드는 실제로 대부분 절차 적입니다.

그러나 이것은 Java로 절차 코드를 작성하는 데 아무런 문제가 없습니다. OO를 사용하면 이점이 있지만 초보자와 혼동하고 싶지는 않습니다. 따라서 Java를 가르치는 데 아무런 문제가 없습니다. 실제 OO를 기대하지는 않지만 작동합니다.

그러나 Java는 컴퓨터 내부에서 일어나는 일에 대한 많은 하위 수준의 세부 정보를 숨 깁니다. C는 이것들을 훨씬 더 공개적으로 남겨둔다. 학생들이이를 관리하는 언어를 사용하기 전에 저수준의 세부 사항이 어떻게 작동하는지 배우는 것이 좋은 사례가 될 수 있습니다. 그러나 이러한 세부 사항을 무시하고 나중에 배우도록 사례를 만들 수도 있습니다.


2

몇몇 다른 사람들은 이미이 주제에 대해 대답했지만, 이것을 더 명확하게 언급 할 가치가 있다고 생각합니다.

Java와 같은 객체 지향 언어로 프로그래밍 학습을 시작하더라도 OO 개념에 도달하기 전에 절차 적 프로그래밍 기술을 배우는 것으로 시작합니다 . 새로운 프로그래머 Java를 가르 칠 때는 먼저 객체와 클래스를 소개하지 않고 명령문과 변수를 소개합니다. 학생이 사물과 수업에 관해 많은 것을 배울 수있는 시점에 이미 최소한 절차 적 프로그래밍의 기초를 가지고 있습니다.

따라서 최소한 Java로 절차 적 프로그래밍을 배우고 Java로 객체 지향 프로그래밍을 배워야합니다. 절차 적 프로그래밍에 1 년을 보내거나 프로그래밍 과정의 처음 몇 주를 보내고 다른 언어를 사용하는지 여부는 세부 사항에 대한 논쟁입니다.


0

그것에 대해 과감하게 말하면, 이것에 대한 추진력은 주로 옛날을 원하는 오래된 프로그래머로부터 나온 것입니다.

다른 말을하기 전에, 나는 나이가 많은 프로그래머들에게는 전혀 경합을 하지 않습니다 . 불행히도 때때로 그렇지 않은 사람들, 씻겨지고 실제로 프로그래밍에 능숙하지 않은 사람들은 '실제 세계'에서 해킹 할 수 없을 때 교수가됩니다. ( 모든 교수는 아니지만 ... 많은)

OOP는 프로그래밍의 성배가 아니며 절차 적 프로그래밍도 유물이 아닙니다. 적어도 두 가지 를 모두 아는 것이 좋지만 절차 적 프로그래밍으로 배우는 것에 대한 일반적인 관행은 시간과 노력을 낭비하는 경향이 있다고 생각합니다. 우리는 하나의 스타일 만이 아니라 학계에서 프로그래밍 을 배워야 합니다 . 나는 내 자신을 포함하여 상당히 끔찍한 코드와 오해를 불러 일으킨다.


2
89 년부터 C를 사용하는 교사가 있었지만, 99 년을 기대하는 마이크로 칩이었습니다. 그런 다음 'c ++'을 사용하지만 STL이나 템플릿이없는 다른 선생님이있었습니다. 함수 포인터가있는 구조체 일 수도 있습니다.
Ape-inago

1
공평하게 말하면, STL과 템플릿은 일반적으로 C ++ 주제가 아닙니다. 101 레벨 프로그래밍 과정의 기본 목표는 주어진 구문의 제약 조건 내에서 잘 구조화 된 순차적, 조건부 및 반복 논리를 만드는 방법을 가르치는 것입니다. 다른 모든 언어 기능은 구문 제어 설탕으로 기본 제어 구조를 그룹화하고 데이터에 바인딩 할 수 있습니다.
비트 트위 들러

두 개의 downvotes를 넣습니다. 한 의견은 나에게 이상한 일 이었지만, 그 의견은 원래 나쁘지 않은 가르침으로부터 회복시키는 데 도움이 된 더 오래된 프로그래머에게서 나왔기 때문입니다. @Ape : CS 부서 책임자는 2004 년 XD에서 1 년 동안 코볼을 가르치려고 노력했습니다. 기계 lol 그러나 geeze… .. 정말로?)
Garet Claborn

1
@ bit-twiddler-아주 이상합니다. 나는 이 견해에서 경험에 크게 의존하지 않지만 다른 로케일을 조사했습니다. 나는 두 가지 스타일의 프로그래밍을 정말 좋아하며 함께 가르쳐야한다고 생각합니다. 나는 조금 더 젊은 교수들도이 문제에 대해 같은 비율의 열 광학을 가지고 있지 않다는 것을 알게되었습니다. 좋은 IMO입니다. 나는 절차 상 우선이 중요하다고 생각하는 사람들도 있습니다.
Garet Claborn

1
@ bit-twiddler : 예,하지만 입문 과정은 아니 었습니다. 데이터베이스 디자인에서 4 년째의 고급 과정이었으며 우리는 c ++를 사용해야했습니다. 이전 과정에서 C ++을 높은 수준으로 경험 한 후에는 잘못된 느낌이 들었습니다.
Ape-inago

0

두 가지 이유 : 하나의 OO 프로그래밍이 절차 적 프로그래밍 문제를 해결하기 위해 왔습니다. 따라서 절차 적 코딩을 작성하고 OO로 동일한 것을 작성하면 차이점을 더 쉽게 이해할 수 있습니다.

여기에는 추가 요소가 있습니다. 프로그래밍 주제를 교육하는 두 가지 접근 방식. 하나는 얻을 수있는 한 낮게 (예 : 조립, 많은 장소에서 절차 적, 일부는 회로로 시작) 시작한 다음 (OO / 기능 / 관리쪽으로) 올라갈 수 있습니다. 다른 접근 방식은 실제 세계 (예 : 브라우저 / Windows 7 등)에서 시작한 다음 더 깊이 들어가는 것입니다. 각 접근 방식에는 장단점이 있습니다. 당신의 대학은 첫 번째를 선택했고 절차부터 시작합니다. 일부 이론적 근거가 있거나 방금 다른 사람을 복사했습니다 :-).


1
"OO 프로그래밍은 절차 적 프로그래밍 문제를 해결하기 위해왔다." 그것이 목표 였지만 OO는 해결되는 한 많은 문제를 일으켰습니다.
bit-twiddler

@ bit-twiddler : 매우 큰 이야기. 에 초점 (또는 아래로 축소) 교육 학적 측면에서,이 사건을한다 : 우리가 이것을 가지고 무엇을, 우리가 더 잘 만들 었는지 : (당신이 더 나은 여부의 경우에 주장) 것을
드미트리 Mistriotis

0

제도적 관성 외에 다른 이유는 없습니다. CMU를 보면 전체 OOP 커리큘럼을 버리고 기능 프로그래밍으로 대체했습니다. 다시 한 번, 귀하의 질문에 대한 답변은 귀하가 다니는 학교의 관리자가 임의로 선택한 것입니다. 내가 여기에 한 사실에 대해 궁금해하는 사람이 있다면 한 교수 / 관리자가 CMU의 커리큘럼을 변경하는 것에 대한 게시물 입니다. FP를 신입생에게 가르치기 .


1
-1 오해의 소지가 있음-Google 검색을 통해 CMU가 첫해 CS 교육 과정 에서 OOP를 삭제 하고 기능 프로그래밍으로 대체 했다고 주장하는 스레드를 보았지만 공식 CMU 교육 과정은 Alice 프로그래밍 언어로 시작합니다. 지향 [ enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm
Steven A. Lowe

1
@ davidk01 : (1) 실제로 잘못된 주장. (2) "앨리스는 학생들이 객체 지향 프로그래밍에 처음으로 노출되도록 설계된 무료 교육 도구 "입니다. alice.org
Steven A. Lowe

2
@Steven A. Lowe : 말의 입에서 곧바로 : "객체 지향 프로그래밍은 본질적으로 반 모듈 식 및 반 평행이기 때문에 현대식 CS 교과 과정에 적합하지 않기 때문에 입문 과정에서 완전히 제거됩니다. 이 주제를 연구하고자하는 학생들을 위해 객체 지향 설계 방법론에 대한 새로운 코스가 2 학년 수준으로 제공 될 것입니다. " - 신입생에게 FP 교육
davidk01

1
@ davidk01 : 훌륭한 링크, 감사합니다. "글로벌 객체 지향 프로그래밍 (여러 형태로)이 산업용 소프트웨어 개발에서 지배적 인 주제로 남아 있지만, 초급 수준에서 Java와 같은 객체 지향 언어를 사용하면 상당히 복잡하고 산만 해집니다. 핵심 목표에서 입문 수준에서 . 입문 수준에서 기본에 더 집중 농도를 할 수 있도록 교육 과정의 후반부에 OO 설계 및 구현 방법의 풀러 범위를 제공하는 것이 바람직 것 같다. " [강조 광산] ...
Steven A. Lowe

1
@ davidk01 : 동의하지 않아서 기쁩니다. 원한다면 pedantic이라고 불러주십시오. 그러나 저에게 소개 레벨의 강조를 바꾸는 것과 "전체 OOP 커리큘럼을 버렸습니다"는 중요한 차이가 있습니다. 입문 강좌의 범위를 "강철 한 변화"로 줄이는 것은 거의 부를 수 없습니다. ;-)
Steven A. Lowe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.