문제

파이썬의 대규모 개발에 대해 배우고 특히 대형 코드 기반을 어떻게 유지합니까?

  • 메소드의 서명을 비 호환성을 변경하면 해당 메소드가 호출되는 모든 장소를 어떻게 찾을 수 있습니까? C ++/Java에서 컴파일러는 당신을 위해 그것을 찾을 것입니다. 어떻게 파이썬에서 그것을합니까?

  • 코드 내부에서 깊게 변경할 때 정적 유형이 조회 할 수 없으므로 인스턴스가 제공하는 작업을 어떻게 알 수 있습니까?

  • 입력 오류 (오타)를 어떻게 처리/방지합니까?

  • UnitTest는 정적 유형 검사를 대신하여 사용됩니까?

당신이 생각할 수 있듯이 나는 거의 정적으로 입력 한 언어 (C ++/Java) 와만 일했지만 더 큰 프로그램을 위해 Python에 손을 대고 싶습니다. 그러나 나는 오래 전에 Clipper (DBase) 언어로 매우 나쁜 경험을 가졌으며 동적으로 입력했습니다.

도움이 되었습니까?

해결책

아무도 Pychecker, Pylint 및 유사한 도구를 지적하지 않았기 때문에 나는 다음과 같습니다. Pychecker와 Pylint는 잘못된 가정 (함수 서명, 객체 속성 등)을 찾는 데 도움이되는 도구입니다. 컴파일러가 A에서 찾을 수있는 모든 것을 찾을 수는 없습니다. 정적으로 입력 한 언어 - 그러나 그러한 언어에 대한 그러한 컴파일러도 찾을 수없는 문제를 찾을 수 있습니다.

파이썬 (및 동적으로 입력 된 언어)은 원인이 될 가능성이있는 오류와 검출 및 수정 방법 측면에서 근본적으로 다릅니다. 그것은 명확한 다운 사이드와 업 사이드를 가지고 있지만, 많은 사람들 (나 포함)은 Python의 경우 코드 작성의 용이성 (및 구조적으로 건전하게 만드는 용이성) 및 코드 수정의 용이성이 있다고 주장 할 것입니다. 없이 API 호환성을 깨뜨리는 (새로운 선택적 인수 추가, 동일한 방법과 속성 세트를 갖는 다른 객체를 제공 함) 큰 코드베이스에 적합합니다.

다른 팁

스크류 드라이버를 망치로 사용하지 마십시오

Python은 정적으로 입력 한 언어가 아니므로 그렇게 사용하지 마십시오.

특정 도구를 사용하면 구축 된 제품에 사용합니다. 파이썬의 경우 다음을 의미합니다.

  • 오리 타이핑 : 유형 확인이 없습니다. 행동 만 중요합니다. 따라서이 기능을 사용하도록 코드가 설계되어야합니다. 좋은 디자인은 일반적인 서명, 구성 요소 간의 의존성, 높은 추상 추출 수준을 의미합니다. 따라서 무엇이든 변경하면 나머지 코드를 변경할 필요가 없습니다. Python은 그 어느 것을 제작했는지 불평하지 않을 것입니다. 유형은 문제가되지 않습니다.

  • 거대한 표준 라이브러리. 코딩하지 않은 표준 기능을 사용하는 경우 프로그램의 모든 통화를 변경할 필요는 없습니다. 파이썬에는 배터리가 포함되어 있습니다. 나는 매일 그들을 계속 발견합니다. 나는 시작했을 때 사용할 수있는 모듈의 수에 대해 전혀 몰랐다. 괜찮아요, 처음부터 바로 얻을 수는 없습니다.

당신은 Java, C ++, Python, Php, Erlang 등을 쓰지 않습니다. 그들은 많은 다른 언어들 각각을위한 공간이있는 이유이며, 같은 일을하지 않습니다.

단위 테스트는 대체물이 아닙니다

단위 테스트는 모든 언어로 수행해야합니다. 가장 유명한 단위 테스트 라이브러리 (주니)는 Java World에서 왔습니다!

이것은 유형과 관련이 없습니다. 당신은 다시 행동을 확인합니다. 회귀 문제를 피하십시오. 당신은 당신이 당신이 당신의 트랙에 있는지 확인합니다.

대규모 프로젝트를위한 파이썬

언어, 라이브러리 및 프레임 워크는 확장되지 않습니다. 아키텍처가 있습니다.

견고한 아키텍처를 설계하면 신속하게 진화 할 수 있다면 확장됩니다. 단위 테스트는 도움, 자동 코드 점검도 도움이됩니다. 그러나 그들은 단지 안전망 일뿐입니다. 그리고 작은 것들.

Python은 약간의 좋은 관행을 강화하고 일반적인 디자인 패턴이 내장되어 있기 때문에 대규모 프로젝트에 특히 적합합니다. 그러나 다시 설계되지 않은 것에 사용하지 마십시오. 예 : Python은 CPU 집약적 인 작업을위한 기술이 아닙니다.

거대한 프로젝트에서는 어쨌든 여러 가지 기술을 사용할 가능성이 높습니다. A로 SGBD (프랑스어 DBMS)) 및 템플릿 언어 또는 그렇지 않습니다. 파이썬도 예외는 아닙니다.

빠른 코드의 일부에 C/C ++를 사용하고 싶을 것입니다. 또는 a에 맞는 Java 수코양이 환경. 몰라, 상관 없어. 파이썬은 이것들과 잘 어울릴 수 있습니다.

결론으로

내 대답은 조금 무례하다고 느낄 수 있지만, 잘못 이해하지 못합니다. 이것은 아주 좋은 질문입니다.

많은 사람들이 오래된 습관으로 파이썬에옵니다. 나는 파이썬처럼 Java를 코딩하려고 노력했다. 당신은 할 수 있지만 결코 최선을 다할 수는 없습니다.

당신이 Python을 가지고 놀고 싶다면, 그것은 훌륭합니다! 훌륭한 도구입니다. 그러나 실제로 도구 일뿐입니다.

나는 오픈 소스 파이썬 "기타 영웅"클론 인 "Frets on Fire"를 수정 한 경험이있었습니다.

내가 알다시피, 파이썬은 실제로 대규모 프로젝트에 적합하지 않습니다.

나는 호환되지 않는 유형의 할당과 관련하여 개발 시간 디버깅 문제의 많은 부분을 소비하는 것을 발견했습니다. 또한 런타임에 유형이 결정되기 때문에 기존 코드를 이해하려고 시도하는 것이 더 어려워집니다. 현재보고있는 매개 변수의 유형이 무엇인지 전혀 모릅니다.

그 외에도 이름 문자열을 사용하여 함수를 호출합니다. __getattr__ 내장 기능은 일반적으로 다른 프로그래밍 언어보다 Python에서 일반적으로 더 일반적이므로 통화 그래프를 특정 기능으로 다소 어렵게 가져옵니다 (정적으로 입력 한 일부 언어로 이름으로 함수를 호출 할 수 있지만).

Python은 소규모 소프트웨어, 빠른 프로토 타입 개발 및 기존 프로그램을 함께 결합하여 실제로 빛나고 있다고 생각하지만 이러한 유형의 프로그램에서는 실제 문제가되고 제 생각에는 Python이 있기 때문에 대규모 소프트웨어 프로젝트에는 사용하지 않을 것입니다. 거기에서 상대적으로 약합니다.

내 0.10 EUR :

'Production'State에 몇 가지 Python 응용 프로그램이 있습니다. 우리 회사는 Java, C ++ 및 Python을 사용합니다. 우리는 Eclipse IDE (Pydev for Python)와 함께 발전합니다.

UnitTests는 문제의 핵심 솔루션입니다. (C ++ 및 Java의 경우)

"Dynamic-Typing"의 덜 안전한 세계는 코드 품질에 대해 덜 부주의하게 만듭니다.

그런데:

대규모 개발은 하나의 언어를 사용한다는 의미는 아닙니다!

대규모 개발은 종종 사용됩니다 문제와 관련된 소수의 언어.

그래서 동의합니다 햄머 프로젝트 :-)


추신: 정적 유형 및 파이썬

다음은 파이썬에서 상당히 큰 시스템을 유지하는 데 도움이 된 몇 가지 항목입니다.

  • 코드를 계층으로 구성하십시오. 즉, 별도의 비즈 논리, 프리젠 테이션 로직 및 지속성 계층. 이러한 계층을 정의하는 데 약간의 시간을 투자하고 프로젝트의 모든 사람이 가져 오도록하는지 확인하십시오. 대규모 시스템의 경우 특정 개발 방식을 강요하는 프레임 워크를 만드는 것도 중요 할 수 있습니다.

  • 테스트는 핵심이며, 단위 테스트 없이는 다른 언어보다 여러 번 더 빠르게 관리 할 수없는 코드 기반으로 끝날 수 있습니다. 단위 테스트로는 종종 충분하지 않으며, 주요 변경 후 신속하게 실행할 수있는 몇 가지 통합/수락 테스트가 있어야합니다.

  • 사용 빠르게 실패합니다 원칙. 코드가 취약하다고 생각하는 경우에 대한 어설 션 추가.

  • 문제를 신속하게 탐색하는 데 도움이되는 표준 로깅/오류 처리가있어

  • Pylint/Checker 통합을 제공하는 IDE (Pydev Works Me)를 사용하여 일반 오타를 즉시 감지하고 일부 코딩 표준을 홍보 할 수 있도록 도와줍니다.

  • 수입에 대해 조심스럽게, X 가져 오기 * 또는 사용하지 않고 상대 수입을하지 마십시오.

  • Refactor, 검색/교체 도구 인 일반 표현식으로 메소드/클래스 유형 리팩토링을 이동하는 데 필요한 모든 것입니다.

메소드의 서명을 호환 할 수없는 변경. 이것은 Java 및 C ++에서와 마찬가지로 파이썬에서는 발생하지 않습니다.

Python에는 선택적 인수, 기본값 및 방법 서명을 정의 할 때 훨씬 더 유연성이 있습니다. 또한 오리 타이핑은 예를 들어 상당한 소프트웨어 변경의 일부로 일부 클래스에서 인터페이스로 전환 할 필요가 없음을 의미합니다. 상황은 복잡하지 않습니다.

그 방법이 호출되는 모든 장소를 어떻게 찾습니까? Grep은 동적 언어를 위해 작동합니다. 모든 장소가 사용되는 모든 장소를 알아야하는 경우 GREP (또는 동등한 IDE 지원 검색)가 훌륭하게 작동합니다.

정적 유형이 조회 할 수 없으므로 인스턴스가 제공하는 작업을 어떻게 알 수 있습니까?

ㅏ. 소스를보세요. 객체 라이브러리와 JAR 파일의 Java/C ++ 문제가 없습니다. 해당 언어에 필요한 모든 정교한 보조 도구와 도구가 필요하지는 않습니다.

비. IDE는 많은 일반적인 상황에서 서명 정보를 제공 할 수 있습니다. 당신은 쉽게 IDE의 추론 권한을 물리 칠 수 있습니다. 그런 일이 발생하면 아마도 당신이하고있는 일을 검토해야 할 것입니다. IDE가 유형 정보를 추론 할 수 없다면 아마도 너무 역동적 일 것입니다.

씨. 파이썬에서는 종종 대화식 통역사를 통해 작업합니다. Java 및 C ++와 달리 인스턴스를 직접적이고 대화식으로 탐색 할 수 있습니다. 정교한 IDE가 필요하지 않습니다.

예시:

  >>> x= SomeClass()
  >>> dir(x)

입력 오류를 어떻게 처리/방지합니까? 정적 언어와 동일합니다 : 당신은 그것들을 방해하지 않습니다. 당신은 그들을 찾고 수정합니다. Java는 특정 클래스의 오타 만 찾을 수 있습니다. 두 개의 유사한 클래스 또는 가변 이름이있는 경우 정적 유형 확인을 통해서도 심각한 문제에 빠질 수 있습니다.

예시:

class MyClass { }
class MyClassx extends MyClass { }

이 두 클래스 이름이있는 오타는 혼란을 야기 할 수 있습니다. [ "하지만 나는 자바와 함께 그 위치에 있지 않을 것입니다." 동의했다. 나는 파이썬과 함께 그 위치에 있지 않을 것입니다. 당신은 크게 다른 수업을 만들고, 오용하면 일찍 실패 할 것입니다.

UnitTest는 정적 유형 검사를 대신하여 사용됩니까? 다른 관점은 다음과 같습니다. 정적 유형 검사는 명확하고 간단한 디자인을 대신합니다.

응용 프로그램이 왜 작동했는지 잘 모르는 프로그래머와 함께 일했습니다. 그들은 왜 물건이 컴파일되지 않았는지 알 수 없었습니다. 추상 슈퍼 클래스와 인터페이스의 차이점을 알지 못했고, 제자리 변경이 왜 별도의 JAR 파일 충돌로 다른 모듈을 만들어 주는지 알 수 없었습니다. 정적 유형 검사는 결함이있는 디자인에 대한 잘못된 자신감을주었습니다.

동적 언어는 프로그램이 간단하게 될 수 있습니다. 단순성은 정적 유형 검사를 대체합니다. 명확성은 정적 유형 검사를 대신합니다.

저의 일반적인 규칙은 소규모 비 미료 크리티컬 프로젝트 및 정적으로 큰 프로젝트에 정적으로 언어를 사용하는 데 동적 언어를 사용하는 것입니다. Python과 같은 역동적 인 언어로 작성된 코드가 더 빨리 "엉키고"됩니다. 부분적으로 그것은 동적 언어로 코드를 작성하는 것이 훨씬 빠르며 적어도 내 경우에는 바로 가기와 더 나쁜 디자인으로 이어집니다. 부분적으로는 Python에 적합하지 않은 Java를 사용할 때 빠르고 쉬운 리팩토링을위한 Intellij가 있기 때문입니다.

이에 대한 일반적인 대답은 테스트 테스트 테스트입니다. 광범위한 단위 테스트 스위트가 있고 특히 새 버전이 온라인으로 진행되기 전에 자주 실행해야합니다.

동적으로 입력 된 언어의 지지자들은 유형 시스템의 조잡한 규칙에 정적으로 입력 된 언어에도 불구하고 어쨌든 테스트 해야하는 경우를 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top