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
ملفًا Compile_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 | PlantUML | MermaidJS |
---|---|---|
الميراث | ||
منظمة | ||
التبعية | ||
تجميع | ||
تعبير | ||
التخصص في القالب/الإنشاء | ||
التداخل (الطبقة الداخلية/التعداد) | ||
تضمين (محلي) | ||
تضمين (النظام) |
بالنسبة لقواعد التعليمات البرمجية النموذجية، يمكن أن يكون الرسم التخطيطي الفردي الذي تم إنشاؤه من التعليمات البرمجية بأكملها أو حتى مساحة اسم واحدة كبيرًا جدًا بحيث لا يكون مفيدًا، على سبيل المثال كجزء من الوثائق. يسمح 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.