Fortran 77로만 코딩 된 사람에게 객체 지향 프로그래밍을 어떻게 설명 할 수 있습니까?


11

어머니는 포트란에서 대학 논문을 썼으며, 현재 (10 년 후) 유체 시뮬레이션을위한 c ++를 배워야합니다. 그녀는 모든 절차 적 프로그래밍을 이해할 수 있지만 객체를 아무리 설명하려고해도 문제가되지 않습니다. (Java로 많은 작업을 수행하므로 객체의 작동 방식을 알고 있습니다) 너무 높은 수준의 방식으로 설명하고 있다고 생각하므로 전혀 협력하지 않고 성장한 사람에게는 실제로 의미가 없습니다. 순전히 절차 적 프로그래밍 시대에

그녀에게 이해하는 데 도움이되는 간단한 방법이 있습니까?


2
목수가되지 않고 새집을 지을 수 있습니다. 어쩌면 그녀는 프로젝트 / 절차대로 프로젝트를 시작할 수 있으며 OOP 방식으로 리팩토링하는 방법을 보여줄 수 있습니다. 때로는 "OOP를 얻지 못하지만" "어째서 네가 왜 그 모든 문제를 겪는 지
모르겠다

4
그녀는 실제로 객체 지향적 인 프로그래밍을해야합니까, 아니면 OpenFOAM을 일종의 절차적인 방식으로 사용하는 것으로 충분합니까?
starblue

그녀는 그것을 객체 지향 방식으로하고 싶다. 최소한 그녀는 아마도 객체와 클래스 인 API와 인터페이스하는 방법을 이해해야합니다. (나는 OpenFOAM으로 아무것도하지 않았으므로 약간의 추측입니다.)
Eric Pauley

1
이전 포스터에 전적으로 동의합니다. OOP가 무엇이며 라이브러리를 사용해야하는 것에 대한 인식은 서로 상당히 다를 수 있습니다. 해당 라이브러리의 메일 링리스트에 연락하여 일부 고위 사용자에게 lib 문제에 어떻게 접근하는지 물어볼 것입니다. 그녀의 문제를 해결하지 않으면 서 오해로 이어질 뿐인 OOP를 '가르치려고'하지 마십시오.
AndreasScheinert

답변:


18

짧은 대답 : 아닙니다.

긴 대답 : OOP는 단순하지 않기 때문에 "간단한 방법"이 없습니다. 절차 적 프로그래밍은 "변수"와 "만약 그렇다면"에 관한 것입니다. 다른 모든 것들은 구문 설탕이지만,이 네 가지는 모두 절차 적 프로그래밍에 관한 것입니다. 일단 당신이 그들을 얻을 아무것도 당신을 막을 수 없습니다.

OOP는 변수와 코드 조각을 구성하는 방법입니다. OOP를 정의하기 위해 몇 개의 패턴이 있습니까? 25? 30? 다른 언어와 배경에서 OOP를 배운 교사조차도 자체 정의에 동의하지 않으므로 어떻게 간단 할 수 있습니까?

네가 어떻게 왔는지 모르겠지만 네 엄마도 비슷한 경험을했기 때문에 내가 어떻게 왔는지 말해 줄 수있어

매우 큰 프로젝트에서 C로 프로그래밍했습니다. 많은 프로그래머들이 모듈과 라이브러리를 구성하는데, 다른 작업에서 간섭을 피하고 업무를 잘 분리하는 데 어려움이 있습니다.

우리는 모든 상호 관련된 전역 데이터를 구조체에 넣고 구조체에 콜백이 필요한 함수 포인터를 배치하는 "솔루션"에 도달했습니다. 우리는 그런 방식으로 io_mask(텍스트 모드 대화 상자 graphic_manager등) 등을 일반화했습니다 .

1996 년에 이러한 구조체의 이름을 "클래스"로 지정하고 해당 함수 포인터를 멤버 함수 및 가상 함수로 대체했거나 이전 프로젝트를 갱신 한 다른 프로그래머가 다른 개체 (동작이라고 함)로 연결 한 것을 쉽게 알 수있었습니다.

분리, 다형성 및 런타임 정의 동작과 같은 필요성 을 느끼기 시작할 때 OOP를 이해하기 시작했습니다 .

오늘 나는 OOP와 함께 일하지만, 그것을 설명하는 교리로 생각하지 않습니다. 단지 "일반적인 관용구"(집합 ...)는 우리가 항상 긴 설명과 설명을 제공 할 필요없이 함께 말할 수있게합니다. . 사실, 다른 것보다 더 많은 "컨벤션". 결국, 모든 OOP는 "다시-"이면 "다중 계층화"를 수행합니다. 따라서 관용구에 대한 추상화와 관용구.

그들을 무시하라. 그녀는 그들이 필요하다고 느끼지 않을 때까지 설명조차하지 않습니다. 그녀는 그것들을 단순한 일을하는 복잡한 방법처럼 느낄 것입니다. 그리고 그녀는 옳습니다 ... 그녀가하는 일이 실제로는 단순 할 때까지.

맨 위에 네 가지가 있다면 아무도 "책상 정리"를 생각하지 않을 것입니다. 맨 위에있는 물체가 서로 간섭하기 시작하면 이치에 맞습니다. 이제 OOP가 시작될 때입니다.

C ++로 작업하기 위해 OOP가 필요하지 않습니다. 전체 C ++ 표준 라이브러리는 OOP 측면에서 설계되지 않았으며 (협력 가능하지만) C ++은 Java가 아닙니다.

내 경험상 최악의 C ++ 교사와 C ++ 프로그래머는 Java에서 온 사람들이며 모든 것에 대한 모든 편견은 OOP가 아니며 C ++과 같은 언어를 변질시키는 것은 OOP가 아닙니다.

C ++ : Accelerated C ++ 에 접근하고 싶은 사람들에게 좋은 책을 제안 해 드리겠습니다. 사전 정의 된 교리를 따르지 않고 C ++ 숙어로 안내합니다.


OpenFOAM과 함께 작업하려면 c ++을 알아야하므로 곧 클래스를 알아야합니다. 그녀는 기본 아이디어를 이해하고 있다고 생각합니다. 그러나 어떤 이유로 그녀는 '도트 구조'에 갇혀있는 것처럼 보입니다. (예 : c ++을 제외한 System.out.println ())
Eric Pauley

@Zonedabone은 클래스, 가상 메소드 등의 작동 의미를 이해하고 설명하기가 쉽습니다 (이 답변이 제안하는 것처럼). 로켓 과학이 아닙니다. 쓸모없고 관련없는 OOP "추상"을 피하십시오.
SK-logic

1
OOP는 간단하지만 C ++ "OOP"는 간단하지 않습니다. 스몰 토크를 취하십시오 (객체에는 인스턴스 변수와 클래스가 있고 클래스에는 메소드가 있습니다. 메시지와 메소드에 의해 서비스되는 객체는 기본적으로 있습니다). 프로토 타입 지향 OOP는 클래스를 방정식에서 벗어날 수도 있습니다. --- 따라서 (가능한 경우) 하위 집합 (개인, 보호되지 않음, const 없음, 다중 상속 없음, 모든 메서드 가상, 모든 소멸자 가상 등) 만 사용하도록 권장하므로 모델이 더 간단합니다. 나중에 다른 것을 추가하십시오.
herby

7

오랜 친구가 내가 자신이 OO 프로그래밍에 대해 알고있는 가장 짧은 정의를 가지고 있다고 주장했으며, 일부 사람들에게는 효과가 있다는 것을 알았습니다.

객체 지향 프로그래밍은 의견이있는 데이터입니다. 의자를 움직이지 말고 의자를 움직이라고 요청하십시오. 목록을 정렬하지 않고 자체적으로 정렬하도록 요청합니다 (아마도 힌트 포함). 기타.

아이디어는 프로그램 내에서 일이 어떻게 수행되는지에 대해 다르게 생각하도록 하는 것입니다.


+1 이것은 또한 "조회하지 말아라".
user949300

당신은 "말하지 말아라"를 의미합니다. :)
Ramon Leon

3

그녀에게 현실 세계의 사물과 같은 사물을 생각하도록하십시오. 예를 들어 전 세계는 객체 지향 프로그래밍 (C ++)과 일종의 기능적 프로그래밍 (아마도 Lisp)으로 혼합 될 수 있습니다.

잔디 깎는 기계와 같은 물건을 가져 가십시오. 특정한 속성이 있으며 특정 일을 할 수 있습니다. (객체와 클래스)

그런 다음 잔디 깎는 기계의 연장선 인 더 나은 잔디 깎는 기계에 대해 이야기하십시오. 그녀에게 더 잘 말하지만 여전히 동일한 메커니즘 (상속)을 기반으로합니다.

그런 다음 자신에 대해 이야기하십시오. 그녀에게 때때로 잔디 깎기 전문가가 될 수 있다고 말하지만 실제로는 프로그래머이며 생계를 위해 그것을한다. 이것은 두 개의 다른 엔티티로 동시에 행동하는 것과 같습니다. 이것은 다형성입니다.

그녀가 이것을 얻을 때, 그녀가 배우는 언어로 이러한 것들을 구현하는 방법에 대해 이야기하십시오 (C ++).

그런 다음 컴퓨터 세계에서이 세상에 대한 시뮬레이션을 작성해야한다면 어떻게해야하는지 알게 될 것입니다.

그녀는 현실에 대한 생각을 프로그램 코드로 변환하는 방법을 알고있을 때. 그녀는 객체 지향 프로그래밍 언어로 프로그래밍하는 방법을 배웠을 것입니다.


@ Zonedabone 문제 없음, 나는 1 년이 걸렸지 만 OOP (나 자신에게 배웠습니다)를 배우지 만 같은 예를 사용했습니다.) 갑자기 깨달았습니다. LOL
Aniket Inge

5
아냐 아냐 아냐 아냐 아냐 내 경험상 "실제 세계의 객체에 대해 생각"은 OOP를 아직 이해하지 못하는 사람에게 OOP를 설명 하는 끔찍한 방법입니다. 그것은 OOP의 기괴한 오해와 오용으로 이어지며 종종 혼란을 심화시킵니다.
JSB ձոգչ

다형성 규칙은 최적화와 같습니다. 규칙 A)하지 마십시오., 규칙 B) (전문가 만 해당) : 아직하지 마십시오.
mattnz

1
JSB ձոգչ에 동의하십시오. 그것은 정말 일반적인 OOP 설명하는 방법,하지만 내 생각에 정말 도움이되지이다. 프로그래밍의 객체는 실제의 객체와 전혀 다릅니다.
Rowan Freeman

본질적으로 절차 적 프로그래밍과 OO 프로그래밍의 차이점은 절차 적 프로그래밍에서는 어떤 순서로해야 할 일에 대해 생각하고 OO에서는 상태에 대해 생각한다는 것입니다. 사람들이 탄탄한 상태를 이해하면 OO를 유용하게 사용할 수 있습니다. 훨씬 더 많은 실제 세계를 모델링하려고합니다.
Pieter B

1

나는 어셈블러와 COBOL에서 Ruby로 갔다.

처음에 도움이 된 것은 실제로 인스턴스를 만드는 클래스의 개념을 무시하는 것이 었습니다.

코드로 시작하십시오. 수업이 있지만 수업 수준의 방법이 있습니다. 메서드 내에서 매개 변수, 변수, 조건부, 배열, 문자열, 부울 등이 많이 있습니다.이 내용은 익숙해야합니다.

따라서이 시점에서 클래스는 모든 관련 메소드를 넣을 장소로 목적을 제공하는 것으로 볼 수 있습니다. 컨테이너라고 부르거나 라이브러리는 그녀에게 더 친숙 할 것입니다.

분명히 코드는 관리가 가능하도록 세분화되어야하므로 이러한 각 영역 중 하나를 갖게됩니다. 예를 들어, PC에서 유틸리티 프로그램 세트를 관리하기 위해 계산기의 모든 코드를 한 곳에 저장할 수있는 계산기 클래스가있을 수 있습니다. 당신의 PC에 하나의 계산기 만 있다면 클래스 수준의 방법으로 충분합니다.

시작입니다.

이제 여러 계산기를 열고 각 계산기의 모양과 화면의 위치를 ​​변경하려는 사실을 고려하십시오. 이제 'screen_location'과 같은 계산기 메서드를 사용할 수 없습니다. 여러 개가 있고 각 인스턴스마다 고유 한 위치가 있습니다 ... 각 인스턴스 ... 좋아요. 그래서 인스턴스가 필요합니다.

참고 : 내 용어는 C ++이 아닌 루비에서 왔으므로 번역해야 할 수도 있습니다.


0

개념을 얼마나 나누고 싶은지에 따라 2 단계 또는 4 단계로 설명하겠습니다.

1 단계 : 구조 소개 Fortran 데이터 유형에서 구조에 이르기까지 상당히 작은 단계입니다. 1a 단계 : 동적 메모리 할당 및 포인터를 이해했는지 확인하십시오.

2 단계 : 해당 구조와 관련된 절차 만 추가하십시오. 2a 단계 : 더 작은 구조를 "포장"하는 더 큰 구조를 구축하는 것에 따라 상속을 추가합니다.

포트란 프로그래머에게 "와우"요소는 컴파일러가 추적해야 할 것이 많다는 것입니다. 예. 그것이 컴파일러의 목적입니다 ...


그녀는 사물 뒤에있는 과정을 이해한다고 생각합니다. 그녀가 어떤 이유로 그녀는 점을 이해하지 못합니다. ( '.') 정말 이상합니다. 모든 것이 수동으로 할당되어야 할 때 코딩을 시작할 때 (할당 및 물건) 현대 언어의 내부 작동 방식을 알지 못하고 어떻게 작동하는지 알 수 있습니다.
Eric Pauley

0

그녀가 10 년 전에 논문을 만들었다면 Fortan 90 또는 95를 사용했을 것입니다.이 경우 파생 된 데이터 형식과 관련하여 이야기해야합니다. 그녀가 Fortran 77을 사용한지 오래 전에 Fortran 90에서 파생 된 데이터 유형을 소개하고 그것에 대해 이야기하십시오 ...

캡슐화를 파악한 후 특별한 경우와 캡슐화의 확장으로 볼 수 있기 때문에 다형성과 상속에 들어 가지 않을 것입니다. 나는 아마도 자유 기능이나 정적 클래스를 허용하는 언어로 그녀를 시작할 것입니다.


0

일단 그녀가 구조를 이해하면, 다음 핵심 요점은 객체 지향 프로그래밍이 어떤 것이 전달 될 수있는 메소드 세트를 실제로 적용 할 수있는 메소드 세트로 제한하는 수단으로 작용한다는 것을 인식하는 것입니다. 의회.

객체 지향이 아닌 프로그래밍에서 Tree와 LinkedList에 대해 별도의 데이터 유형을 사용하는 경우 각각에 노드를 추가하기 위해 다른 방법을 사용해야합니다. 비 객체 지향 언어는 일반적으로 하나는 두 가지 방법을 모두 이름을 시도 쿼크한다면 AddItem주어진 이름은 오직 하나의 방법을 참조 할 수 있기 때문에, 따라서 같은 메소드 이름 만드는 일을 주도,, AddTreeItem, AddLinkedListItem, RemoveTreeItem, 등 이러한 접근 방식의 작품을하지만 약간의 추한. 개념적으로 메소드 AddTreeItemRemoveTreeItem함께 속해있는 것처럼 보이지만 이름은 그렇게 정렬되지 않습니다. 이름을 TreeAddItem, 로 다시 쓸 수 있습니다 TreeRemoveItem.LinkedListAddItem각 메소드 호출의 시작 부분에 "중복 노이즈"가 많이 발생합니다. 일반적인 프로그램에서 대부분의 메소드 호출에는 세 가지 필수 정보가 있습니다. (1) 소스 코드의 어떤 섹션에 메소드가 포함되어 있는지; (2) 섹션의 방법 중 어떤 방법이 사용되는지; (3) 어떤 데이터가 수행되고 있습니까? 많은 경우에, 수행되는 데이터의 유형은 그 방법이 속하는 코드 섹션을 식별하기에 충분하므로, 상기의 (1) 부분은 중복된다. 문장의 시작 부분에서 다른 곳의 재료보다 시각적으로 재료를 식별하는 것이 더 쉬우므로 코딩 / 네이밍 스타일과 같이 TreeAddItem(myTree, whatever)가장 유용한 정보를 가장 중요한 위치에 배치합니다.

반대로, 객체 지향 프로그래밍을 사용하면 메소드 이름을 효과적으로 지정할 수 있으며 Tree.AddItem, 이와 같은 명령문 myTree.AddItem(whatever)은 컴파일러가 "Hmm ... myTree은 유형 이므로이 Tree코드를 호출해야합니다 Tree.AddItem(). 컴파일러는의 유형을 알고 있기 때문에 Tree.호출 할 때를 지정합니다 . 개념적으로, 같은 문장 은 같고 일부 객체 지향 언어는 두 형태를 모두 동등하게 허용 할 수 있습니다. 같은 클래스에 정의 된 메서드는 암시 적 유형의 매개 변수를 사용 하고처럼 이름을 지정 , 또는 .AddItemmyTreemyTree.AddItem(whatever)Tree.AddItem(myTree, whatever)TreeTreethisselfMe

객체 지향 프로그래밍 언어는 종종 상속, 가상 함수 등과 같은 다양한 추가 기능을 포함하여 많은 응용 프로그램에서 매우 유용하지만 이러한 기능이 없어도 기능에 따라 기능을 그룹화하는 기능은 매우 유용합니다.


0

클래스 지향적 의미에서 객체 지향 프로그래밍은 데이터 표현을 조작하는 코드와 결합하는 것에 관한 것입니다. 다음 사항이 의미가있는 경우 이치에 맞습니다.

  • 커플 링 : 작동하는 데이터 표현과 함께 오퍼레이션 정의

  • 후기 바인딩 : 런타임시 데이터 표현 및 동작 조합 선택

  • 캡슐화 : 구성에 의해 데이터가 유효하고 나중에 무효화되지 않도록 보장

그게 다야. 마찬가지로 어떤 기술, 그 중심에 단순히 많은 발전이 나중에 따랐다있는 편의,입니다. 기본 사항을 이해하면 나머지는 제 시간에 따라옵니다.


0

BlueJ를 다운로드하여 20 분 동안 재생 한 다음 20 분 동안 재생하는 것이 좋습니다.

클래스, 인터페이스 및 상속을 시각화하는 방식은 매우 명확하고 직관적이므로 무언가를 구현할 때 즉각적으로 이해할 수 있습니다.

클래스와 객체의 차이점을 직접 보여줍니다.

OO 디자인 패턴에 대한 깊은 통찰력은 없지만 개념에 대한 환상적인 개요를 제공합니다.


0

프로그래밍 패러다임과 이러한 패러다임을 구현하는 프로그래밍 언어의 차이점을 상기시키기 위해 저의 공헌을 추가하고 싶습니다.

따라서 C ++을 사용하여 F77 사용자에게 객체 방향을 설명하는 가장 좋은 방법은 단계적으로 진행하는 것입니다.

먼저, Fortran 77에서 객체와 유사한 구조를 개발하는 방법을 보여줌으로써 친숙한 설정에서 객체 방향의 개념을 사용자에게 소개하십시오. 예를 들어 B. Patton "Object-oriented Fortran 77 (실무자 SIGPLAN Fortran Forum 12, 2 (1993), pp. 23-24 및 그 참조.

그런 다음 해당 구조와 C ++ 클래스 및 메소드 간의 대응 관계를 설정하십시오.

마지막으로, OO 프로그래밍을 용이하게하기 위해 C ++가 제공 할 수있는 추가 기능에 대해 논의하십시오.


0

Pascal에서 처음 훈련을하면서 객체 지향 언어로 처음 마이그레이션 할 때 '.' 문제는 저에게 가장 큰 장애물이었습니다. 그것을 극복하는 데 몇 년이 걸렸습니다.

실제로 변수를 포인터로 생각하는 데 익숙 할 때 변수가 다른 변수에 속하는 것은 실제로 직관적이지 않습니다. 나를위한 걸림돌은 다음과 같습니다.

  • 기본적으로 포인터 인 것을 가리키는 것은 다른 포인터를 가리키고 부모 포인터와 다른 것으로 해석하는 것입니까?

나를위한 aha 순간은 최상위 포인터가 기본적으로 네임 스페이스라는 것을 깨달았을 때였습니다.

점 표기법을 사용하지 않고 기능을 네임 스페이스로 작성 해야하는 코드를 작성하도록 제안하는 것이 좋습니다. 그런 다음 점 표기법을 사용하여 다시 작성하도록하십시오.

그 운동을하는 것은 그녀에게 초기 "무슨 마법인가?" 장애물.


-2

이전에 설명하는 데 도움이 된 주요 통찰력은 클래스의 여러 인스턴스를 가질 수 있다는 사실입니다. "도면"또는 "곰팡이"및 "사본"의 관점에서 설명하고 그것이 어디로 인도되는지 확인하십시오.


downvotes를 실제로 이해하지 마십시오. 이 설명 방법은 몇 번 도움이되었습니다. 그것은 총알이라고 말하지는 않지만 사람들이 이것에 붙어있는 것처럼 보입니다.
Alexander Torstling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.