구성 요소와 모듈간에 차이점이 있습니까?


30

모듈 및 구성 요소라는 용어에 약간의 문제가 있습니다. 내 생각에 모듈은 번들 클래스이며 잘 정의 된 인터페이스를 통해서만 액세스 할 수 있습니다. 모든 구현 세부 사항을 숨기고 재사용 할 수 있습니다. 모듈은 의존하는 모듈을 정의합니다.

구성 요소와의 차이점은 무엇입니까? 일부 책에서 찾아 보았지만 구성 요소에 대한 설명은 매우 비슷합니다.


5
어느 언어? 어느 아키텍처? 모듈 정의가 작동합니다. 모듈은 GUI에 연결할 수 없지만 GUI와 같은 것에 플러그인하는 것으로 생각합니다. GUI 구성으로 랩핑 / 지원되는 경우 모듈은 GUI에서 작동 할 수 있습니다.
Guy Coder

3
참조 클래스 구성 요소 대 제어 대 참고 : 귀하의 질문에 langauge 또는 아키텍처를 언급하지 않기 때문에 나는 대답하고 있지 않다.
Guy Coder

그렇습니다.이 경우, 일반적인 정의에 대해 생각합니다
Mirco

2
나는 당신이 유효한 대답을 얻었는지 확인한 후에 더 포인트가 없습니다. 이 정보가 유효하면 질문을 편집하고 원하는 답변으로 링크를 추가하십시오. 질문이 너무 일반적이고 특정 답변이 다른 사람을 곤란하게 만들 수 있기 때문에 답변으로 게시하지 않습니다.
Guy Coder

예, 제 질문은 매우 일반적이며 그 답은 사용 된 언어 나 환경에 따라 다릅니다. Nerver는이 용어들에 대해 너무 다른 정의가 있다고 생각했다
Mirco

답변:


12

용어는 비슷합니다. 나는 일반적으로 "모듈"이 "구성 요소"보다 크다고 생각합니다. 구성 요소는 일반적으로 범위가 비교적 작은 단일 부품으로, 범용 일 수 있습니다. 예를 들어 UI 컨트롤 및 타이머, 스레딩 어시스턴트 등과 같은 "배경 구성 요소"가 있습니다. "모듈"은 전체의 큰 부분으로, 대개 외부 간섭없이 복잡한 기본 기능을 수행합니다. 전자 우편이나 데이터베이스와의 통합을 제공하는 응용 프로그램의 클래스 라이브러리 일 수 있습니다. ERP / 회계 플랫폼의 "채권 수취 모듈"과 같이 스위트의 단일 응용 프로그램만큼 클 수 있습니다.

또한 "모듈"은 더 호환 가능한 것으로 생각합니다. 새로운 구성 요소는 오래된 구성 요소처럼 보이지만 어떤 방식 으로든 "더 나은"구성 요소를 복제 할 수 있지만 일반적으로 시스템 설계는 구성 요소 (또는 해당 구성 요소의 특정 동작에 맞게 설계된 대체 구성 요소)에 더 엄격하게 의존합니다. 비 컴퓨터 용어로, "구성 요소"는 자동차의 엔진 블록 일 수 있고; 엔진 내에서 땜질을하고 엔진을 완전히 교체 할 수는 있지만 자동차에는 엔진이 있어야하며 자동차의 "스톡"엔진을 교체하려면 치수, 무게, 장착 지점 등과 같은 매우 엄격한 사양을 준수해야합니다. 원래 설계되었습니다. 반면 "모듈"은 "플러그인"유형 기능을 의미합니다. 그 모듈이 무엇이든 시스템의 다른 부분에 미치는 영향을 최소화하면서 모듈을 제거 및 / 또는 교체 할 수있는 간단한 방법으로 통신 할 수 있습니다. 집의 전기 시스템은 고도로 모듈화되어 있습니다. 120V15A 플러그가있는 모든 것을 120V15A 콘센트에 꽂을 수 있으며 플러그가 작동하는 것을 기대할 수 있습니다. 시스템의 단일 브랜치에서 전력 요구가 안전 한계를 초과하지 않는 한, 집 배선은 어디에 꽂혀 있는지를 신경 쓰지 못했습니다.


4
모든 답변이 실제로 도움이되었지만 하나만 수락 할 수 있습니다. KeithS는 그가 가장 낮은 담당자를 가지고 있기 때문에 동의합니다
Mirco

12

모듈 의 일반적인 의미는 하나의 특정 프로그램에 묶이지 않고 재사용 가능한 코드 그룹입니다. 이것은 전체 GUI 라이브러리 세트에서 단일 클래스에 이르기까지 모든 것이 될 수 있습니다.

일반적인 의미 구성 요소 는 특정 인터페이스를 사용하여 대체 가능성을 추가로 제한하는 모듈입니다. GUI 위젯 구성 요소를 작성하는 경우 호출 코드에서 특별한 작업을 수행하지 않고도 위젯이 예상되는 모든 위치에서 사용할 수 있습니다. 일반적으로 모듈에는 그러한 제한이 없습니다. Qt와 GTK +는 모듈이지만 코드를 호출하는 데 상당한 노력을 기울이지 않고 다른 모듈을 교체 할 수 없으므로 구성 요소가 아닙니다.

많은 프레임 워크 나 프로그래밍 언어는이 용어를 사용하여 훨씬 더 구체적인 것을 의미하므로 사람들이 문맥에 대해 묻는 이유입니다. 일반적인 의미의 구성 요소 일 수 있지만 매우 구체적인 IComponent인터페이스를 구현하지 않으면 컨텍스트에서 구성 요소로 간주되지 않을 수 있습니다. 파이썬에서는 명령을 module사용하여 얻을 수있는 매우 구체적인 기술적 의미가 있습니다 import. 일반적으로 사람들은 이러한 상황 별 의미를 말합니다.


귀하의 정의는 훌륭하지만 귀하의 예 (Qt 대 GTK +)에는 결함이 있습니다 (그러나 나는 그것들 중 어느 것도 컴포넌트라고 부르지 않을 것에 동의합니다). IMHO Qt 및 GTK +는 모두 수백 개의 작은 구성 요소를 포함하므로 매우 광범위한 인터페이스 모음이 생성됩니다. 즉 누군가가 이제까지 그 중 하나의 인터페이스 호환 교체를 만들기 위해 시간을 투자하는 것이 매우 어려울 수 있습니다, 그리고 그것은 그들이 어떤 구성 요소없는 이유 이럴입니다. 그러나 두 개의 소프트웨어를 교환 할 수 없다고해서 공통 인터페이스를 가진 구성 요소로만 구성 요소로 자격을 상실하지는 않습니다.
Doc Brown

8

특정 언어, 프레임 워크 및 자체 해석을 추상화하려면 추상 소프트웨어 세분성 계층 구조는 다음과 같습니다.

Product - application, library, service
  Module - GUI, core logic, data, etc...
    Component - purpose specific collection of objects
      Object - collection of primitives
        Primitive - numbers, functions, etc...
  • 생성물

간단하고 간단하게 제품은 연결된 기능 모듈의 작업 모음입니다.

  • 구성 단위

이름에서 알 수 있듯이 모듈의 동기는 모듈성입니다. 많은 주장과 달리 실제로 코드 재사용을 의미하지는 않습니다. 실제로 재사용 할 수없고 설계되지 않은 어떤 것에도 맞지 않는 많은 모듈이 있습니다.

다른 소프트웨어 계층을 분리하여 소프트웨어를 구현 및 유지 관리하기가 훨씬 쉬워지고 다른 GUI 프레임 워크에 대한 프론트 엔드와 같은 것을 다시 구현해야하는 경우 모듈화를 통해 중단없이 쉽고 안전하게 수행 할 수 있습니다. 사방에 코드.

모듈은 모듈 요구 사항에 정의 된대로 공통의 목적을 모두 수행하는 구성 요소 콜렉션을 캡슐화합니다. 모듈은 자체 포함되고 완전해야하며 실제로 자체적으로 사용할 수는 없지만 적합한 구현과 함께 작동 할 수 있어야합니다.

  • 구성 요소

세분성 측면에서 컴포넌트는 모듈과 객체 사이에 있습니다. 구성 요소의 목적은 범용 오브젝트를 모아 목적 별 단위를 구성하는 것입니다.

이름에서 알 수 있듯이, 모듈과 달리 구성 요소는 "자체 포함"이 아니며 더 큰 기능 전체의 일부입니다.

  • 목적

객체는 구성 요소의 더 작은 빌딩 블록입니다. 객체는 프리미티브의 모음으로, 좀 더 구체적인 수준을 유지하면서도보다 낮은 수준의보다 보편적 인 기능을 제공하기 위해 이들을 결합합니다.

  • 원선

프리미티브는 가장 작고 단순하며 가장 낮은 수준의 소프트웨어 개발 세분성입니다. 대부분의 언어에는 추가 "일등 시민"이 있지만 기본적으로 정수와 실수 및 함수 / 연산자입니다.

프리미티브로 할 수있는 일은 거의 없으며 동시에 거의 모든 레벨을 달성 할 수있는 매우 낮은 레벨입니다. 프리미티브와 직접 작업하면서 달성하는 것은 매우 장황하고 매우 복잡하고 불가능합니다.

  • 이 모든 것의 요점은 무엇입니까?

위에서 이미 언급했듯이 프리미티브로 직접 작업하는 것은 매우 나쁜 생각입니다. 오늘날의 소프트웨어 개발을 위해 수행하는 것은 매우 복잡하고 느리고 지루할뿐만 아니라 테스트 및 유지 관리에 매우 방해가되고 방해가됩니다.

이러한 개념 부분을 모두 소프트웨어 개발에 통합하면보다 쉽고 빠르며 간단하며 안전합니다. 다재다능하고 보편적 인 원자의 수에 관계없이 원자로 집을 만들지 않습니다. 그것은 무익한 운동이 될 것이다. 당신의 원자는 프리미티브이고, 점토는 물체이며, 벽돌은 구성 요소, 벽, 바닥 및 지붕은 모듈이며 함께 조립되어 최종 제품을 나타냅니다.

인간은 실제로 어떤 것도 발명하지 않으며, 우주에서 이미 존재하는 것을 발견 한 다음 복사하여 우리의 삶에 적용합니다. 동일한 세분성 계층 구조는 원자와 그 아래에서 유기 분자, 단백질, 조직, 장기, 유기체 등 우주 자체에 내재되어 있습니다. 현실 자체는 작고 단순하며 기능이 제한적이며 목적이있는 추상적 인 것을 결합하여 동일한 원칙을 따릅니다. 더 크고, 더 복잡하고, 더 기능적인 것들과 더 특정한 목적의 것들.

  • 용어주의 사항

기술적으로 그들은 모두 "개체"이며, 소프트웨어 개발의 "구성 요소"이며, 모두 함께 사용할 수있을만큼 "모듈 식"이며, 제작 된 의미에서 "제품"입니다. ..

이것은 용어 나 명명법에 관한 것이 아니라 사물을 확대 및 축소하는 것이 창의성과 생산성의 다양한 측면에 어떤 영향을 미치는지에 관한 것입니다. 그리고 다른 모든 수준을 사용하는 것의 중요성뿐만 아니라 잘못된 수준에서 목표를 달성하지 않으려는 것의 중요성에 대해서도 비생산적 일 수 있습니다.


1
모듈 버전은 패키지처럼 들립니다.
JM Becker

1
@JMBecker는 실제로 세분성 측면에서 패키지가 객체 컬렉션에서 완전한 독립형 제품에 이르기까지 모든 것으로 구성 될 수는 없습니다. 패키징은 세분화 체인의 링크보다 코드 재사용에있어 편리한 것입니다.
dtech

3

상황에 따라 다릅니다. 모듈은 이미 다른 언어의 '패키지'또는 '조립'과 유사한 일부 언어의 DLL 수준 그룹을 참조하는 데 사용됩니다. 컴포넌트는 게임 개발에서 일반적으로 사용되는 엔티티 기반 컴포넌트뿐만 아니라 COM에 사용됩니다.

일반적으로 아키텍처 용어로, 모듈과 컴포넌트는 모두 잘 정의 된 인터페이스 뒤에있는 일부 코드 번들을 나타내는 경향이 있습니다. 일반적으로 모듈은 더 큰 번들을 나타내는 경향이 있습니다. 종종 인터페이스 세트가 있으며 모듈은 자체적으로 견딜 수있는 경향이 있습니다.

반면에 구성 요소는 전체 코드보다 작은 코드 묶음 인 경향이 있습니다. 그들의 이름으로, 그들은 더 큰 것의 구성 요소 인 경향이 있습니다. 때로는 응용 프로그램 자체이지만 클래스 디자인에서 컴포지션 사용이 증가함에 따라 더 큰 객체의 구성 요소가 더 자주 나타납니다. 구성 요소에 대해 잘 정의 된 인터페이스는 또한 앱이 서로를 위해 구성 요소를 교체 할 수 있도록하는 경향이 있습니다. 모듈은 그러한 교환 성을 갖지 않는 경향이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.