clang-uml
은 YAML 구성 파일에 의해 구동되는 UML 클래스, 시퀀스, 패키지 및 포함 다이어그램 생성기에 대한 자동 C++입니다. 프로젝트의 주요 아이디어는 코드 기반 또는 문서 레거시 코드 내에서 최신 다이어그램을 쉽게 유지 관리하는 것입니다. clang-uml
의 구성 파일은 생성된 각 다이어그램의 유형과 내용을 정의합니다. 다이어그램은 PlantUML, MermaidJS 및 JSON 형식으로 생성될 수 있습니다.
clang-uml
현재 C++ 버전 20과 C 및 Objective-C를 지원합니다.
전체 문서는 clang-uml.github.io에서 찾을 수 있습니다.
clang-uml
수행할 수 있는 작업을 보려면 여기에서 단위 테스트 사례에 대해 생성된 다이어그램이나 clang-uml-examples 저장소의 예제를 확인하세요.
지금까지 지원되는 주요 기능은 다음과 같습니다.
보다 포괄적인 문서는 clang-uml.github.io에서 확인할 수 있습니다.
Linux
, macos
및 Windows
용 설치 지침은 여기에서 확인할 수 있습니다.
clang-uml
소스 코드 컴파일에 사용되는 명령 목록이 포함된 최신 compile_commands.json 파일이 필요합니다.
기존 C++ 빌드 시스템 중 일부를 사용하여 compile_commands.json
생성하는 방법에 대한 지침은 여기를 참조하세요.
기본적으로 clang-uml
구성 파일 .clang-uml
및 컴파일 데이터베이스 compile_commands.json
파일이 현재 디렉터리에 있다고 가정하므로 해당 파일이 프로젝트의 최상위 디렉터리에 있는 경우 다음을 실행하면 됩니다.
clang-uml
다이어그램의 출력 경로와 컴파일 데이터베이스의 대체 위치는 .clang-uml
구성 파일이나 명령줄 매개변수를 통해 지정할 수 있습니다.
다른 옵션은 도움말을 참조하세요:
clang-uml --help
구성 파일은 YAML로 작성되며 clang-uml
에서 생성해야 하는 다이어그램의 정의를 제공합니다. 기본 예는 다음과 같습니다.
compilation_database_dir : .
output_directory : diagrams
diagrams :
myproject_class :
type : class
glob :
- src/*.cc
using_namespace : myproject
include :
namespaces :
- myproject
exclude :
namespaces :
- myproject::detail
plantuml :
after :
- ' note left of {{ alias("MyProjectMain") }}: Main class of myproject library. '
자세한 구성 파일 참조 가이드는 여기를 참조하세요.
clang-uml
수행할 수 있는 작업을 보려면 여기에서 테스트 사례 문서를 찾아보세요.
clang-uml
자체에 대한 다이어그램을 보려면 자체 구성을 기반으로 다음을 실행하십시오.
make clanguml_diagrams
docs/diagrams
폴더에 있는 SVG 다이어그램을 엽니다.
다음 C++ 코드:
template < typename T, typename P> struct A {
T t;
P p;
};
struct B {
std::string value;
};
template < typename T> using AString = A<T, std::string>;
template < typename T> using AStringPtr = A<T, std::unique_ptr<std::string>>;
template < typename T>
using PairPairBA = std::pair<std::pair<B, A< long , T>>, long >;
template < class T > using VectorPtr = std::unique_ptr<std::vector<T>>;
template < class T > using APtr = std::unique_ptr<A< double , T>>;
template < class T > using ASharedPtr = std::shared_ptr<A< double , T>>;
template < class T , class U >
using AAPtr = std::unique_ptr<std::pair<A< double , T>, A< long , U>>>;
template < typename T> using SimpleCallback = std::function< void (T, int )>;
template < typename ... T> using GenericCallback = std::function< void (T..., int )>;
using VoidCallback = GenericCallback< void *>;
using BVector = std::vector<B>;
using BVector2 = BVector;
using AIntString = AString< int >;
using ACharString = AString< char >;
using AStringString = AString<std::string>;
using BStringString = AStringString;
template < typename T> class R {
using AWCharString = AString< wchar_t >;
PairPairBA< bool > bapair;
APtr< bool > abool;
AAPtr< bool , float > aboolfloat;
ASharedPtr< float > afloat;
A< bool , std::string> boolstring;
AStringPtr< float > floatstring;
AIntString intstring;
AStringString stringstring;
BStringString bstringstring;
AAPtr<T, float > atfloat;
protected:
BVector bs;
public:
BVector2 bs2;
SimpleCallback<ACharString> cb;
GenericCallback<AWCharString> gcb;
VoidCallback vcb;
VectorPtr<B> vps;
};
결과는 다음과 같습니다(PlantUML을 통해).
여기에서 원시 이미지를 열고 클래스 및 메서드에 대한 마우스 오버 도구 설명과 하이퍼링크를 확인하세요.
다음 C++ 코드:
# include < atomic >
# include < functional >
# include < iostream >
# include < memory >
# include < string >
namespace clanguml {
namespace t20029 {
std::string encode_b64 (std::string &&content) { return std::move (content); }
template < typename T> class Encoder : public T {
public:
bool send (std::string &&msg)
{
return T::send ( std::move (
// Encode the message using Base64 encoding and pass it to the next
// layer
encode ( std::move (msg))));
}
protected:
std::string encode (std::string &&msg) { return encode_b64 ( std::move (msg)); }
};
template < typename T> class Retrier : public T {
public:
bool send (std::string &&msg)
{
std::string buffer{ std::move (msg)};
int retryCount = 5 ;
// Repeat until send() succeeds or retry count is exceeded
while (retryCount--) {
if ( T::send (buffer))
return true ;
}
return false ;
}
};
class ConnectionPool {
public:
void connect ()
{
if (!is_connected_. load ())
connect_impl ();
}
bool send ( const std::string &msg) { return true ; }
private:
void connect_impl () { is_connected_ = true ; }
std::atomic< bool > is_connected_;
};
int tmain ()
{
auto pool = std::make_shared<Encoder<Retrier<ConnectionPool>>>();
// Establish connection to the remote server synchronously
pool-> connect ();
// Repeat for each line in the input stream
for (std::string line; std::getline (std::cin, line);) {
if (!pool-> send ( std::move (line)))
break ;
}
return 0 ;
}
}
}
결과는 다음과 같습니다(PlantUML을 통해).
다음 C++ 코드:
namespace clanguml {
namespace t30003 {
namespace ns1 {
namespace ns2_v1_0_0 {
class A {
};
}
namespace [ [deprecated]] ns2_v0_9_0 {
class A {
};
}
namespace {
class Anon final {
};
}
}
namespace [ [deprecated]] ns3 {
namespace ns1 ::ns2 {
class Anon : public t30003 ::ns1::ns2_v1_0_0::A {
};
}
class B : public ns1 ::ns2::Anon {
};
}
}
}
결과는 다음과 같습니다(PlantUML을 통해).
포함 그래프를 시각화하고 분석하기 위한 더 간단한 도구를 찾고 있다면 저의 다른 도구인 clang-include-graph를 확인해 보세요.
다음 C++ 코드 구조:
tests/t40001
├── include
│ ├── lib1
│ │ └── lib1.h
│ └── t40001_include1.h
└── src
└── t40001.cc
코드의 include 지시문을 기반으로 PlantUML을 통해 다음 다이어그램이 생성됩니다.
UML | 플랜트UML | 인어JS |
---|---|---|
계승 | ||
협회 | ||
의존 | ||
집합 | ||
구성 | ||
템플릿 전문화/인스턴스화 | ||
중첩(내부 클래스/열거형) | ||
포함(로컬) | ||
(시스템) 포함 |
일반적인 코드 베이스의 경우 전체 코드 또는 단일 네임스페이스에서 생성된 단일 다이어그램은 너무 커서 문서의 일부로 유용하지 않을 수 있습니다. clang-uml
사용하면 간단한 YAML 구성을 사용하여 각 다이어그램에 포함 및 제외할 콘텐츠를 지정할 수 있습니다.
include :
# Include only elements from these namespaces
namespaces :
- clanguml::common
- clanguml::config
# Include all subclasses of ClassA (including ClassA)
subclasses :
- clanguml::common::ClassA
# and specializations of template Class<T> (including Class<T>)
specializations :
- clanguml::common::ClassT<T>
# and all classes depending on Class D
dependants :
- clanguml::common::ClassD
# and all dependencies of ClassE
dependencies :
- clanguml::common::ClassE
# and classes in direct relation to ClassB (including ClassB)
context :
- clanguml::common::ClassB
# Include only inheritance relationships
relationships :
- inheritance
exclude :
# Exclude all elements from detail namespace
namespaces :
- clanguml::common::detail
# and also exclude ClassF
elements :
- clanguml::common::ClassF
이에 대한 자세한 내용은 다이어그램 필터 설명서 섹션에서 확인할 수 있습니다.
clang-uml
의 단위 테스트에 사용되는 내장 테스트 케이스는 여기에서 찾아볼 수 있습니다.
이 프로젝트는 다음과 같은 훌륭한 도구를 사용합니다.
프로젝트에 기여하고 싶다면 기여 지침을 확인하세요.
Copyright 2021-present Bartek Kryza <[email protected]>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.