clang-uml
เป็นคลาส C++ ถึง UML อัตโนมัติ ลำดับ แพ็คเกจ และรวมตัวสร้างไดอะแกรม ซึ่งขับเคลื่อนโดยไฟล์คอนฟิกูเรชัน YAML แนวคิดหลักเบื้องหลังโปรเจ็กต์นี้คือการรักษาไดอะแกรมที่ทันสมัยภายในโค้ดเบสหรือโค้ดดั้งเดิมของเอกสารได้อย่างง่ายดาย ไฟล์การกำหนดค่าหรือไฟล์สำหรับ 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
ต้องการไฟล์คอมไพล์_commands.json ที่ทันสมัย ซึ่งมีรายการคำสั่งที่ใช้ในการคอมไพล์ซอร์สโค้ด
ดูคำแนะนำเกี่ยวกับวิธีสร้างคอม compile_commands.json
โดยใช้ระบบบิลด์ C++ ที่มีอยู่บางส่วนที่นี่
ตามค่าเริ่มต้น 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
และเปิดไดอะแกรม SVG ในโฟลเดอร์ docs/diagrams
รหัส 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
ผลลัพธ์ในไดอะแกรมต่อไปนี้ (ผ่าน PlantUML) ตามคำสั่งรวมในโค้ด:
UML | พืชUML | เมอร์เมดJS |
---|---|---|
มรดก | ||
สมาคม | ||
การพึ่งพาอาศัยกัน | ||
การรวมกลุ่ม | ||
องค์ประกอบ | ||
ความเชี่ยวชาญพิเศษ/การสร้างอินสแตนซ์ของเทมเพลต | ||
การทำรัง (คลาสภายใน/enum) | ||
รวม (ท้องถิ่น) | ||
รวม (ระบบ) |
สำหรับฐานโค้ดทั่วไป ไดอะแกรมเดียวที่สร้างขึ้นจากโค้ดทั้งหมดหรือแม้แต่เนมสเปซเดียวอาจมีขนาดใหญ่เกินกว่าจะมีประโยชน์ เช่น เป็นส่วนหนึ่งของเอกสารประกอบ 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.