프로그래밍 범례 개술

프로그래밍 업계에는 코드를 어떻게 만드는지 설명하는 유행어가 많다.물론 이런 범례는 어떤 구체적인 문제를 해결하는 구체적인 방식이 아니다.그들의 문제에 대한 사고 방식은 매우 광범위하고 보편적이다.이 모든 것이 배타적인 것은 아니다.내가 여기서 이야기하는 것이 반드시 유일한 것은 아니다. 단지 내가 겪은 흔한 토론일 뿐이다.

프로그램 프로그래밍
프로그램화 프로그래밍은 하나의 프로그램을 무엇을 해야 하는지를 완전히 설명하는 일련의 절차로 간주하는 것을 의미한다.어떤 의미에서 보면 모든 것은 프로그램화 프로그래밍으로 귀결될 수 있다. 왜냐하면 모든 gets compiled to processor instructions은 본질적으로 프로그램화되기 때문이다.그러나 이런 사고 프로그래밍 방식은 본질적으로 정확하지만 복잡한 문제를 생각하는 가장 좋은 방식은 아니다.

대상방향 프로그래밍
적어도 내 이해에서 대상을 대상으로 프로그래밍하는 사상은 프로그램을 대상의 상호작용 모델로 간주하는 것이다.이곳의 한 대상은 구체적인 사물을 나타내는 데이터 구조이다.클래스는 객체의 템플릿과 같습니다.
예를 들어 전형적인 JPRG-like battle system을 실현하려면 전투 중의 역할을 나타내는 역할 유형이 필요합니다.캐릭터 대상은 생명, 힘, 마법과 같은 특정한 속성이나 장소를 가지게 된다.객체가 처리되기 때문에 특정 객체에 첨부되는 프로세스와 같은 방법도 있습니다.
데미지 계산의 작업 방식에 따라 캐릭터류는 take_damage 방법이 있을 수 있으며, 공격을 받았을 때 이 방법을 사용할 수 있다.이런 방법은 캐릭터가 가지고 있을 수 있는 어떠한 저항이나 명중 효과도 내부에서 해석할 수 있다.이것은 start_round 방법이 있을 수 있다. 매 라운드가 시작될 때마다 모든 캐릭터를 호출할 수 있다. 이 방법은 점차 사라지는 진도 상태 효과, 독약 활성화 또는 재생 효과, 또는 라운드가 시작될 때 발생하는 모든 일을 할 수 있다.
이렇게 생각하면 잠재적인 좋은 점이 많다.첫째, 특정 객체와 관련된 모든 컨텐트를 객체에 선명하게 부착할 수 있습니다.주전 순환 중의 코드는 데미지가 어떻게 계산되는지 걱정할 필요가 없다. 단지 한 바퀴의 절차를 걱정할 뿐이다. (각 캐릭터의 동작을 얻고, 그 다음에 각 캐릭터의 방법을 순서대로 호출하는 것).
대상 프로그래밍은 격렬한 논쟁의 화제로 많은 사람들think it's wonderfulother people이 그것을 엉망으로 여긴다.I came to my ideas on it some time ago .

이벤트 구동 프로그래밍
이벤트 구동 프로그래밍은 주로 인터랙티브 응용 프로그램에 응용되는 프로그래밍 사고방식이다.그것을 이해하려면, 프로세스 프로그래밍이 이런 일을 어떻게 처리하는지 이해해야 한다.
만약 당신이 그래픽 인터페이스를 가진 프로그램을 만들려고 한다면, 예를 들어 웹 응용 프로그램을 만들려고 한다면, 하나의 과정의 범례에서, 당신은 대부분의 시간을 그 안에서 순환하게 될 것이다.루프는 기본적으로 위조 코드입니다.
> Check if there's been any input from the mouse or keyboard or whatever input device.
> Get an "event" data structure describing that input.
> Look at the event, and see what action needs to happen based on it, if any.
> Take the necessary action.
> Update the display.
이것은 완전히 주 순환 중인 매우 추악한 논리이다.이렇게 작성된 프로그램은 곧 이해하기 어려워질 뿐만 아니라 that means hard to avoid bugs.
이벤트 구동 프로그래밍은 수동으로 작성된 내용이 아닌'mainloop'을 핵심 개념으로 삼아 사용자 인터페이스를 고려한다.인터페이스 요소를 대상이나 다른 것으로 설정하고, 모든 요소가 입력에 어떻게 응답해야 하는지를 설명하고mainloop 함수를 호출합니다. 코드의 측면에서 볼 때, 이것은 한 줄입니다. mainloop의 모든 절차가 봉인되어 있기 때문에, 그것들을 고려할 필요가 없습니다.
이벤트 구동 프로그래밍은 예상 분야에서 매우 유익하다. 왜냐하면 이것은 이런 문제를 사고하는 자연스러운 방식이기 때문이다.이 프로그램의 코드는 주로 인터페이스와 행동을 설명하는 것이지, 이 행동을 실현하는 모든 단계를 설명하는 것이 아니다.일반적으로 [콜백] 함수를 사용하여 비헤이비어를 지정합니다.예를 들어, Button 대상이 있을 수 있습니다. handleClick 방법을 정의할 수 있습니다. 단추를 누르면 주 순환이 이 방법을 호출합니다.
봉인mainloop을 통해 이벤트 구동 프로그래밍은 업데이트되지 않거나 클릭한 이벤트를 클릭한 요소에 전달하는 것을 잊어버리는 등 오류를 걱정할 필요가 없습니다.만약 네가 주순환의 내부 작업 원리를 생각하고 있다면, 그것은 네가 잘못한 것이다.
Javascript는 기본적으로 일종의 이벤트 구동 언어이다.인터랙티브 웹 응용 프로그램을 위한 디자인이기 때문에 디자인할 때 이 점을 고려했기 때문에 많은 것들이 addEventListener 같은 것으로 완성되었다.Javascript에서, 심지어mainloop을 호출하는 것도 은식이다.이벤트는 사용자 브라우저에서 실행되고 페이지가 불러올 때 시작됩니다.이를 위해 특별히 설계되지 않은 언어 중, 예를 들어 Python 이나 C와 GTK (대상과 이벤트를 위한 GUI 라이브러리) 를 사용하면, 프로세스 설정을 하고 mainloop을 수동으로 호출해야 하지만, 완전히 프로세스로 진행된다면, 이것은 여전히 매우 유용하다.

함수식 프로그래밍
함수식 프로그래밍은 코드를 실행하려는 절차가 아니라 데이터로 변환하는 것을 의미한다.Haskell과 같은 순수 함수식 언어에서는 입력에 필요한 출력을 설명하여 알고리즘을 고려하는 것이지 그것을 어떻게 만드는지 직접 설명하는 것이 아니다.
함수식 프로그래밍에서 함수는 수학적 의미의 함수인 입력을 출력으로 바꾸는 공식일 뿐이다.따라서 함수는 반환값 이외의 내용을 변경할 수 없고, 매개 변수 이외의 내용에 의존할 수 없습니다.이는 매우 제한적인 것으로 보이지만, 가능한 한 많은 확정성을 유지하고, 가능한 한 입출력과 불확실성을 격리하는 것은 논리를 더욱 쉽게 추적하고 오류를 피하는 데 큰 도움이 된다.
함수식 프로그래밍의 한 예는 많은 언어가 가지고 있는 map,filterreduce 함수이다.프로젝트 목록을 가져오고 각 항목에 변환을 적용하려면 프로그램별로 수행하는 방법(자세한 내용은 Python을 예제 언어로 사용합니다.
def get_sqroots(nums):
    sqroots = []
    for num im nums:
        sqroots.append(num ** 0.5)
    return sqroots
이것은 괜찮지만, for 순환과 교체의 전체 모드에 익숙하지 않으면, 무슨 일이 일어났는지 알기 위해서는 1초가 걸린다.새 목록을 만들고 새 값을 추가하고 있습니다.비록 이것은 진정으로 할 수 있을 뿐만 아니라, 반드시 하나의 생각으로 묘사해야 할 임무이지만, 우리가 묘사하는 것은 우리가 어떻게 목표를 달성하는 것이지, 우리가 실현하고 있는 목표만이 아니다.
다음은 실용적인 문제 해결 방법입니다.
def get_sqroots(nums):
    return map(lambda x: x ** 0.5, nums)
(모르면 lambda 이상 함수를 설명합니다.lambda x: x ** 0.5는 한 함수의 이름을 쓰는 것과 같고 이 함수는 x를 받아들이고 되돌아온다x ** 0.5이것은 "nums 의 모든 요소를 이num을 이 함수에 넣은 결과에 비추고 결과 목록을 되돌려줍니다."를 의미합니다.(기술적으로 말하자면 파이톤의 map이 생성기를 되돌려주는 것은 완벽한 방법에 가깝다.프로그램get_sqroots과 완전히 평행하는 것은return list(map(lambda x: x ** 0.5, nums))이거나,kickass 생성기 표현식과 이해로 다음과 같이 쓰여있다return [num ** 0.5 for num in nums]그래서 기본적으로map는 임의의 함수를 임의의 값 집합에 응용하는 광의적인 방법이다.filter와 유사하다. 함수와 서열을 전달하고, 되돌아오는 서열에는 함수가 되돌아오는 요소만 포함한다. TrueAndreduce는 하나의 함수와 하나의 서열을 받아들이고 그 함수를 반복적으로 적용하여 하나의 요소로 간소화된 서열로 되돌려주는 함수입니다.예를 들어 언어에 숫자 목록의 총계를 가져올 수 있는 내장된 방법이 없지만 reduce 있다면 reduce 함수 + 를 사용하여 목록을 얻을 수 있습니다.파이톤에서 이것은 functools.reduce(lambda x, y: x+y, nums)처럼 보인다.Haskell은 기호를 간소화할 수 있습니다. (Reduce는Haskell에서 foldl 라고 하고 기본값이 필요합니다. foldl (+) 0 nums기능 패러다임은 데이터 변환으로 묘사되기 쉬운 일에 놀라운 도움이 될 것이다.순수함수식 언어는 IO와 같은 일을 어떻게 처리하는가a far more complicated story. 이런 상황에서 당신은 종종 순수함수식 언어를 사용하지 않기를 바란다.

성명식 프로그래밍
성명식 프로그래밍은 함수식 프로그래밍과 밀접한 관계를 가진 모델로 데이터와 그 관계를 묘사하는 데 중심을 두고 실행하는 절차가 아니다.나는 이 두 가지가 실제로는 다르다고 확신하지는 않지만, 함수식 프로그래밍은 데이터 간의 관계에 관한 것이고, 성명식 프로그래밍은 진공에서 데이터를 설명하는 것에 관한 것이라고 말하고 싶다.아마도 이와 관련하여 함수식 프로그래밍은 완전한 언어를 묘사하는 경향이 있을 것이다. 그러나 나는 성명식이라는 완전한 프로그래밍 언어를 들어 본 적이 없다.
어쨌든, HTML은 성명식 프로그래밍의 예이다. 브라우저에게 무엇을 해야 하는지 알려주지 않고, 성명, 페이지의 내용을 설명한다.HTML을 강제로 실행하면 어떻게 됩니까?
document.add(header_element("My Document"))
container = create(div_element)
container.set_style("color", "green")
container.add(paragraph_element("Text goes here"))
container.add(link_element("Check out this cool website"))
document.add(container)
보아하니 이렇다.이것은 매우 징그럽지 않아서 읽기가 매우 어렵지 않습니까?
엔진의 깊은 곳에서 브라우저의 렌더링 엔진 중 어느 곳에서 이러한 일련의 절차가 실행되고 있습니다. (아마도 C++로 작성되었을 것입니다.)그러나 이러한 방식을 통해 브라우저 엔진 개발자는 HTML을 화면의 내용으로 정확하게 변환하는 시스템을 만드는 데 전념할 수 있고, 사이트 관리자는 그 내용만 설명하는 HTML을 작성하는 데 전념할 수 있다.위와 유사한 코드를 진정으로 작성할 필요가 있는 사람은 없다.

좋은 웹페이지 즐겨찾기