저는 Java 로 매우 객체 지향 (OO) 스타일로 프로그래밍하고 있습니다. OOP는 나에게 매우 직관적으로 제공되지만 다른 종류의 프로그래밍에 대한 지식이 거의 없습니다.
절차 적 프로그래밍 이란 정확히 무엇입니까? OOP와 정확히 어떻게 다릅니 까? 기능적 프로그래밍 과 똑같은가요?
나는 “OO가 아닌 모든 프로그래밍이 절차 적이라고 생각하곤했습니다.하지만 저는” 이것이 사실이 아니라고 생각하기 시작했습니다.
댓글
답변
Wikipedia는 이러한 용어에 대한 좋은 설명을 제공합니다. 그럼에도 불구하고 요약은 다음과 같습니다.
- 명령형 프로그래밍 는 가변 상태를 변경하는 일련의 문 으로 계산을 모델링합니다.
- 절차 적 프로그래밍 은 코드를 서브 루틴으로 분할하는 명령형 프로그래밍입니다.
- 구조적 프로그래밍 은 임의 점프를 금지하는 절차 적 프로그래밍에 대한보다 체계적인 접근 방식입니다. (예 : goto) 및 전역 상태 변경.
-
선언적 프로그래밍 은 명령형 프로그래밍의 반대입니다. 계산 방법보다는 계산할 내용을 지정합니다 (예 : SQL, regexes).
-
기능적 프로그램 ming 는 계산을 값을 산출 할 수있는 표현식 으로 모델링합니다. 함수는 값이며 다른 함수로 전달되거나 다른 함수에서 반환 될 수 있습니다. 돌연변이는 권장되지 않습니다. 모든 변수는 기본적으로 변경할 수 없습니다. 그 결과,이를 달성하는 데 필요한 상태 변경의 순서보다 계산되는 내용을 강조하기 때문에 “명령 적보다는 선언적”입니다.
- 순수 함수형 프로그래밍 은 돌연변이를 완전히 허용하지 않습니다 (일반적인 믿음과는 달리 여전히 측면을 달성하기위한 메커니즘이 있습니다. 효과).
- 총 함수형 프로그래밍 는 추가로 예외 및 무한 루프를 금지합니다. (수학에서 total 함수는 입력의 모든 값을 반환하는 함수입니다.)
- 객체 지향 프로그래밍 은 추상화 및 모듈화를 달성하기 위해 객체 / 인터페이스 를 사용합니다.
OOP가 있기 때문에 관계가 약간 복잡합니다. 꽤로드 된 용어. 기능적 언어와 절차 적 언어 모두에서 객체를 사용할 수 있지만 스스로를 OO라고 광고하는 언어는 절차 적 언어입니다. 문제를 더욱 혼란스럽게하려면 :
- 대부분의 사람들은 객체와 추상 데이터 유형의 차이 를 모릅니다. li>
- 주요 OOP 언어는 ADT에 대해 언급하지 않고 매우 열악한 지원을 제공하며 개체를 The One True Way라고 선전합니다.
- 아무도 추상 데이터 유형 지향 프로그래밍 (왜냐하면 “어리석은 일이기 때문입니다. ADT와 객체가 모두 필요합니다.)
이로 인해 사람들은 OOP가 추상화를 달성하는 유일한 방법이라고 생각하게됩니다. 함수형 프로그래밍과 OOP는 어떻게 든 반대이거나 상호 배타적입니다. 많은 사람들은 또한 모든 기능적 언어가 순수하고 변이를 허용하지 않는다고 생각합니다.
또한 사람들은 일반적으로 명령형 / 절차 형을 번갈아 사용하며 때로는 OOP (추상화가없는 코드를 의미 함, 일반적으로 C)와 대조하고 때로는 함수형 프로그래밍과 대조합니다. 구조화 된 프로그래밍 이라는 용어는 제가 말할 수있는 한 거의 사용되지 않았습니다 (이 시점에서 대부분의 사람들이 goto와 globals가 유해한 것으로 간주되기 때문일 것입니다.)
댓글
- " 점프 금지 "는 다소 일반적입니다. if / while / etc를 포함합니다. 아마도 " 임의의 점프를 금지하고 "?
- @Izkata 좋은 점, 변경되었습니다.
- 실제로 위키 백과 항목에 연결할 가치가있을 수 있습니다.
- 그것이 ' 이유 '는 Object Only가 아닌 Object " Oriented "라고합니다.
- @OrangeDog 어떻습니까? 추상 데이터 유형과 다른 점은 또한 그것에 작용할 수있는 캡슐화 된 데이터 및 함수 집합을 정의하는 것입니까? 또한 불변 개체를 가질 수 있으므로이 경우 어떤 상태 ?
Answer
절차 적 프로그래밍은 다른 많은 언어 디자인을위한 기본 구성 요소 중 하나 인 프로그래밍에 대한 접근 방식입니다 (기능적이지 않음).
대부분의 언어는 “절차 적 프로그래밍”집합에 속합니다. 그리고 이것은 아마도 대부분의 사람들에게 가장 자연스러운 디자인 접근 방식 일 것입니다 (OO의 관점에서 생각한다면, 나는 당신이 소수에 속한다고 말할 것입니다).
BASIC은 절차 적입니다.
다른 사람들이 말했듯이, 이것은 순차적 인 방식으로 프로그램을 구성하는 메커니즘입니다.
- 먼저 x를합니다
- 두 번째로 y를합니다
- 세 번째로 Z를 수행합니다.
“프로 시저”를 정의하는 메커니즘이 필요합니다. OO 메서드와 유사한 명명 된 코드 블록으로, 0에서 많은 매개 변수를 허용하고 선택적으로 값을 반환 할 수 있습니다. 그러면 일반적으로 함수라고 부릅니다. 아마도 함수 언어와 혼동을 일으킬 것입니다.)
The para digm은 당신이 할 일이나 전달되는 일의 방식을 지시하지 않습니다.
단순히 프로그램이 작동하는 일련의 절차 (또는 함수)로 구성 될 것이라고 설명합니다. 순차적 방식. 그런 다음 데이터는 절차와 독립적으로 정의됩니다.
이는 해당 데이터에 대해 작동하는 데이터 및 메서드 (함수 아님) 모음을 중심으로 프로그램을 구성하는 객체 지향 프로그래밍과 다릅니다.
이에 대해 생각하는 한 가지 방법은 데이터 범위입니다.
절차 적 언어에서 범위 지정은 매우 간단합니다. 변수는 주어진 프로 시저 (로컬로 선언 됨)의 범위에있을 수 있으며, 항목을 호출하는 최상위 수준 (전역 적으로 선언 됨)까지 중첩 된 범위를 사이에 둘 수 있습니다.
객체 지향 언어에서 위와 직각 인 현재 사용중인 객체의 새 범위 지정 컨텍스트를 추가합니다.
객체 지향과 비교하여 절차를 생각하는 또 다른 방법은 객체 지향 언어를 고려하는 것입니다. 모든 메소드는 반드시 정적으로 선언되어야합니다. 결과는 클래스를 사용하여 프로 시저를 그룹화하는 데 사용할 수있는 프로 시저 언어입니다.
Answer
Procedural Programming 은 확실히 함수형 프로그래밍이 아닙니다.
Procedural programming은 컴퓨터 모델을 머릿속에 기계로두고 그 방법을 생각할 때입니다. “의 메모리에서 데이터를 수정합니다. 따라서 먼저 A
를 값 3으로 설정 한 다음 1을 더한 다음 메모리 위치 A
에 다시 저장합니다 (이전 값을 덮어 씀). .
기능적 프로그래밍은 A
가 3이고 B
가 A + 1
그런 다음 컴퓨터가 B
계산 방법을 알아 내도록합니다. A
를 정의한 후에는 변경할 수 해야 합니다 (변경되지 않음). Functional을 사용하면 함수를 처음으로 전달하는 것과 같은 작업을 수행 할 수도 있습니다. 클래스 값 (함수는 함수를 인수로 취할 수 있음).
객체 지향 프로그래밍은 종종 두 가지를 결합하며 둘 다에 직교합니다. 함수형 프로그래밍을 사용하고 불변 객체를 반환 할 수 있습니다. 객체는 계산 된 값을 반환하는 메서드를 가질 수 있으며 심지어 느리게 수행 할 수도 있습니다. 이는 기능적 객체 지향 프로그래밍입니다. 또한 “저장소”(데이터베이스의 추상 버전)를 나타내는 객체를 가질 수 있으며, 저장소에 항목을 “저장”하고 항목을 다시 “가져올”수 있으며 해당 객체가 그 방법에 대한 모든 세부 정보를 처리하도록 할 수 있습니다. ” 이것은 기본적으로 객체 지향 절차 프로그래밍입니다.
답변
OOP는 약간 정제 된 절차 프로그래밍 형식에 불과합니다. , 다시 한 번 더 큰 명령형 프로그래밍 제품군에 속합니다.그 주장의 증거는 많은 C # / Java 프로그래머가 “무언가를 수행”하는 경향이 있으며 다음과 같은 방법을 선호한다는 것입니다.
void doThisAndThat(....) { ... do something ... }
그래서, 한 무리로 구성된 프로그램 of void-methods (이전에는 procedures (sic!)) 및 다음과 같은 코드 :
doThis(); if (state is that) doSomethingElse(); doThat();
는 완벽한 절차 적 프로그래밍입니다.
주석
- doThisAndThat (….)은 일반적으로 좋은 습관이 아닌 한 가지 이상의 일을 메소드가 수행함을 의미합니다. Java 및 C # 개발자는 대부분 단일 책임 원칙을 준수합니다. 나는 당신의 비유에 결함이 있다고 생각합니다. objectmentor.com/resources/articles/srp.pdf
- @JohnK 좋은 습관이 아니라는 것을 알고 있습니다. 그러나 일반적인 것입니다. 특히 Java 개발자들 사이에서는 SO에서 매일 보는 것으로 판단 할 수 있습니다.
- @JohnK Java 및 C # 개발자는 대부분 단일 책임 원칙 -Lip 서비스를 준수합니까?
- @JohnK li>
- Java 개발자는 대부분 단일 책임을 고수합니까? 그것이 실생활에서 사실이라면 …
도 참조하세요.