큰 코드베이스의 먼 부분 사이에 데이터 흐름을 쉽게 추가 할 수 있습니까?


10

대규모 시스템을 변경할 때 종종 일부 기능이 다른 부분에서 일부 데이터를 가져와야하는 문제에 직면하지만 이벤트 리스너, 지연된 호출, 이런 식으로 간단한 변경으로 빠르게 풍선을 can 수 있습니다.

Yossi Kreinin의 블로그 게시물 ( http://www.yosefk.com/blog/i-want-a-struct-linker.html) 의 관련 인용문 :

당신은 많은 종류의 데이터 구조를 가지고 있습니다. 머지 않아, 구조에서 가장 가치있는 것은 그것이 유지하는 데이터가 아니라, 약간의 제어 흐름을 통해 모든 것이 가능하다는 사실입니다.

전역 변수는 코드가 먼 코드에 "소리를내는"방법 중 하나이지만 문제가있는 것으로 알려져 있습니다. 동적 범위 변수는 더 제한적인 방법이지만 문제도 있습니다.

이 문제를 해결하기위한 프로그래밍 언어 연구가 있습니까? 정적 검사, 쉬운 단위 테스트 및 기타 장점을 유지하면서 예기치 않은 데이터 흐름을 큰 코드베이스에 쉽게 추가 할 수 있습니까?


귀하의 질문을 표현하는 방법은 프로세스 간 통신이없는 단일 프로세스를 염두에두고 데이터 흐름을 가지고 있다고 생각합니다. 표준 이벤트 발신자 / 청취자 메커니즘으로 해결할 수없는 문제는 무엇입니까?
Doc Brown

고안된 예 : 시스템 내부에 사용자에게 문자 메시지를 보내는 코드가 있다고 상상해보십시오. 그리고 메시지 텍스트가 사용자 시간대의 현재 시간에 따라 달라져야한다는 새로운 요구 사항이 있습니다. 콜 스택은 다음과 같습니다. 사용자 시간대를 알고있는 일부 코드는 메시지 텍스트를 생성하는 메소드를 호출하는 메소드를 호출하는 메소드를 호출합니다 (... 15 회 반복). 이것은 내 표준에 의한 간단한 예입니다. 의사 소통은 아래쪽으로 만 이루어지기 때문에 15 가지 방법의 서명을 변경하여 사소한 변경을해야합니다.
Vladimir Slepnev 님이

글쎄, 나는 데이터 흐름을 명시 적으로 모델링하고 구성 요소를 데이터 흐름과 분리하는 것이 도움이 될 것이라고 생각합니다. 독일 소프트웨어 엔지니어는이 주제에 대해 많은 글을 쓰고 있습니다. 대부분의 기사는 독일어입니다. 다음은 영어로 된 엔트리 기사입니다. geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/…
Doc Brown

싱글 톤 내부 API가 도움이 될 수 있다고 생각합니다. 응용 프로그램 전체에서 액세스 할 수 있으며 모든 데이터 검색 논리를 캡슐화합니다.
superM

답변:


1

CDI (Context Dependency Injection) AKA IoC (Inversion of Control)를 참조하고 있습니다. Java JSF와 Spring Framework가 그 예입니다. ASP.NET MVC에는 Unity와 같은 플러그인이 있습니다. 자바 스크립트는 RequireJS와 같은 라이브러리를 사용하여 구조를 구성하기 시작했습니다.이 라이브러리는 많은 현대 JS 프레임 워크에서 볼 수있는 주입 동작을 가지고 있습니다. 이는 로컬 및 원격 애플리케이션을 배선하기위한 것입니다.

네트워크에서 느슨하게 커플 링하기 위해 회사는 웹 서비스를 SOAP, REST, AJAX 또는 RPC로 정기적 인 원격 메서드 호출과 함께 사용하려고합니다. Java에서는 JAX-WS 또는 .NET WCF를 사용하여 분산 서비스를 빌드 할 수 있습니다. 그런 다음 서비스 언어 또는 클라이언트의 모든 언어 또는 플랫폼에서 "데이터 흐름"에 정렬합니다. 루비, 파이썬, 스칼라, 자바, C # 등.

느슨한 결합을 사용하면 문제를 나누고 정복 할 수 있으며 서비스는 종종 데이터를 가져 오기위한 데이터베이스의 진입 점입니다. 사다리를 세우면 Message Queue라는 짐승이 있습니다. 그 길은 엔터프라이즈 및 인프라 유형 프레임 워크로 이어집니다.

그러나 프로젝트가 네트워크를 사용하지 않으면 단일 응용 프로그램 내에서 높은 데이터 흐름을 위해 설계된 Scala, Akka, NodeJS 등과 같은 언어가 있습니다. 또한 복잡한 프로젝트를 위해 앞서 언급 한 기술 중 일부 또는 전부와 함께 작동합니다. 예를 들어, 스칼라는 JAX-RS REST 서비스와 함께 사용하여 데이터 소스에서 일종의 "전역 데이터"를 가져오고 IoC 내부 배선을위한 스프링을 가질 수 있습니다. JBoss, .NET 및 MuleESB와 같은 GUI 도구에는 많은 비즈니스 실행 또는 워크 플로 프레임 워크가 있습니다. 개발시 Eclipse 및 Netbeans를 사용하면 시각적 플로우 차트 화면에서 서비스를 끌어서 놓을 수 있습니다.

마지막으로 Java에는 여전히 Singleton Bean이 있습니다. 런타임에 메소드를 조정하려면 프록시 또는 리플렉션 프레임 워크를 사용하십시오. 그러나 솔직히 말해서 1999 년입니다.

시간대에 따라 사용자에게 메시지를 보내기 위해 많은 전화를 거는 경우 제 생각에는 사용자가 보는 것과 동일한 효과를 얻는 2 단계 방법이있을 것입니다. 그러나 CDI 프레임 워크는 기존 언어에서 언급 한 것과 같이 유연한 기능을 모두 제공하는 코트와 같은 기존 언어에서 사용됩니다. 더러운 작업을 완벽하게 처리하면서 프로그램을 잠재 의식이라고 부릅니다.


Message Queues는 과도 할 수 있지만 메시징은 전반적으로 이벤트를 발생시키는 완벽한 방법입니다. Java는 MDB (Message Driven Beans)를 사용하므로 프로그램이 서로 '대화'를 보내거나받을 수 있어야합니다. 비동기 보너스를 위해이 방법으로 할 수 있습니다.
Senor Developer

포인터 주셔서 감사합니다! 의존성 주입과 유사한 패턴을 지원하기 위해 언어가 처음부터 어떻게 설계되었는지 궁금합니다.
Vladimir Slepnev

0

대규모로이를 수행하는 가장 간단한 방법은 실제로 일종의 데이터 캡슐화 API를 사용하는 것입니다. 이것은 NoSQL 스토어이거나 캡슐화 된 RDBMS 일 수 있습니다 (또는 실제로 동일한 애플리케이션에서 다른 시간과 장소에있을 수 있음). 장기적으로 RDBMS를 처리 할 수없는 이유는 없습니다. 단기 상태 제어를 처리하는 스토리지 및 NoSQL db). 일련의 단일 객체 일 수도 있습니다.

그러면 데이터 구조를 다소 관리 된 방식으로 일종의 중립 공간에서 사용할 수 있습니다. 이것은 우리가 LedgerSMB를 사용하는 접근 방식입니다 (그러나 본질적으로 스태킹 된 싱글 톤에 대한 몇 가지 반 전역 변수가 있지만 다시 관리됩니다). 4 개 모두).

물론 모든 접근 방식에는 장단점이 있으며 이러한 절충점을 해결할 수는 없습니다. 핵심은 트레이드 오프가 무엇인지 (관리 대 성능 대 코드의 청결성 대 잠재적 인 코드 함정)를보고 응용 프로그램에 가장 적합한 것을 기반으로 결정을 내리는 것입니다.


답변 해주셔서 감사합니다! 프로그래밍 언어 연구가이 문제에 도움이 될 것 같습니다. 예를 들어, 코드가 전역 데이터베이스 또는 숨김 싱글 톤에서 일부 데이터를 읽는 경우 필요한 데이터에 대한 정적 / 선언적 보증이있을 수 있습니다.
Vladimir Slepnev이

-1

단어를 사용하거나 인용하면

hairy flow of control

그런 다음 코드가 실제로 엉망이라고 가정합니다. 즉시 떨어 뜨려야합니다. 문제의 모듈화 / 분리를 사용하는 경우 "헤어 제어 흐름"과 같은 것은 없습니다. 코드에는 단순성이 부족하므로 전역 변수를 참조했다는 사실도 알 수 있습니다 :-).


왜 공감해야합니까? 인용문에는 내 견해를 정확히 뒷받침하는 소개가 누락되었습니다. "(아마도"Antipattern "또는"Code Smell "으로 분류되며 해당 서클에 이름이 있지만 알 수 없으므로 알 수 없습니다.) "이름이없는 상태로 두십시오)"
user127749

2
이것은 실제로 그 질문에 대한 답이 아니며, 아마도 공판의 이유 일 것입니다.
Daniel Gratzer

그렇다면 소프트웨어 설계의 가장 기본 원칙 중 하나 인 KISS (간단하고 바보 같은 상태로 유지)를 위반하는 코드 엉망을 해소하는 마술이 있습니까? 마술은 마술이 아닙니다. 프로그래머가 아닌 모든 세부 사항을 알고 있기 때문에 대체 할 수없는 프로그래머입니다 (장기적으로 회사를 죽일 것임). 불행히도, 많은 회사들은 처음에 적절한 코드 디자인에 신경 쓰지 않거나 결과를 이해하지도 못하고 코드를 한 번 이상 다시 작성해야하고 많은 경우에도 여러 번 다시 작성해야합니다.
user127749
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.