เนมสเปซที่มีการจัดการ
สรุป
บทนำ
เราใช้เนมสเปซที่มีการจัดการใน Weave SDK เพื่อให้ทั้งนักพัฒนาและผู้ผสานรวม Weave SDK ให้คำแนะนำและข้อความย่อยเกี่ยวกับการระบุชุด API หนึ่งๆ ภายใน SDK ดังกล่าว เพื่อให้พวกเขาวางแผนและคาดการณ์เส้นทางการย้ายข้อมูลของตนในรุ่นของ Weave SDK ได้ รวมทั้งอาจจัดการ Weave API หลายรายการพร้อมกันสำหรับโมดูลที่ระบุได้
การระบุ
เนมสเปซที่มีการจัดการอาจได้รับการจัดการโดยกำหนด 1 ใน 4 ประเภทต่อไปนี้
การพัฒนา
เนมสเปซใดๆ ที่จัดการโดยมีการกำหนดสถานะการพัฒนาเป็นตัวบ่งชี้ให้นักพัฒนาซอฟต์แวร์และผู้รวมบริการทราบว่า API ที่อยู่ภายในนั้นอยู่ระหว่างการพัฒนา อาจมีการเปลี่ยนแปลง และจะไม่ได้รับการรองรับอย่างเป็นทางการ โดยทั่วไปผู้ผสานรวมโปรแกรมจะไม่แนะนำให้ใช้ API เหล่านี้ เว้นแต่จะได้รับคำสั่งมาให้ใช้โดยเฉพาะ
ถัดไป
เนมสเปซใดๆ ที่จัดการด้วยการกำหนดรุ่นถัดไปจะเป็นตัวบ่งชี้ให้นักพัฒนาซอฟต์แวร์และผู้ผสานรวมระบบทราบ API ที่มีอยู่ในขณะที่ส่วนใหญ่การพัฒนาที่มีการใช้งานเสร็จสมบูรณ์แล้ว อาจยังมีการเปลี่ยนแปลงและได้รับการสนับสนุนเพื่อการประเมินล่วงหน้า API ที่กำหนดให้เป็นตัวแทนของสิ่งที่พัฒนาไปอีกขั้นใน Weave SDK API และจะกลายเป็น API เริ่มต้นในปัจจุบันในรอบการเปิดตัวที่สำคัญในเร็วๆ นี้
อาจมีความเข้ากันได้แบบย้อนหลังทั้งจาก API และโปรโตคอลผ่านสายเคเบิล แต่จะไม่มีการรับประกันใน API ที่กำหนด
การกำหนดเนมสเปซที่มีการจัดการใน Next ช่วยให้นักพัฒนาซอฟต์แวร์และผู้ผสานการทำงานสามารถดูทิศทางของ Weave SDK ได้อย่างมีประสิทธิภาพ ด้วยการบอกใบ้เกี่ยวกับสิ่งที่จะกลายเป็น API เริ่มต้นในปัจจุบันในรุ่นถัดไป
การกำหนดเนมสเปซที่มีการจัดการถัดไปเป็นตัวเลือกเพื่อให้เนมสเปซที่มีการจัดการผ่านช่วงวงจรการใช้งานได้โดยไม่ต้องใช้ (โปรดดูวงจร Namespace ที่มีการจัดการ)
ปัจจุบัน
เนมสเปซใดก็ตามที่มีการจัดการด้วยการกำหนดปัจจุบัน หรือเนมสเปซที่ไม่มีการจัดการ (เช่น ไม่มีการระบุเนมสเปซที่มีการจัดการ) จะแสดง API ที่ได้รับการสนับสนุนอย่างเป็นทางการในปัจจุบันและเป็นค่าเริ่มต้นสำหรับส่วนหรือโมดูลดังกล่าวของ Weave SDK แม้ว่าอาจยังมีการปรับปรุง API ดังกล่าวอย่างต่อเนื่อง แต่การเปลี่ยนแปลงส่วนใหญ่จะมีความเข้ากันได้แบบเพิ่มเติมและแบบย้อนหลัง ควรดูแลรักษาทั้ง API และการเชื่อมต่อผ่านสายแทน
การกำหนดเนมสเปซที่มีการจัดการในปัจจุบันเป็นตัวเลือกที่ไม่บังคับเพื่อให้เนมสเปซที่มีการจัดการผ่านช่วงการใช้งานได้โดยไม่ต้องใช้ (โปรดดูวงจร Namespace ที่มีการจัดการ) ที่จริงแล้วเนมสเปซที่ไม่มีการจัดการทั้งหมดจะเป็นปัจจุบันโดยปริยาย
รุ่นเดิม
เนมสเปซใดก็ตามที่มีการจัดการด้วยการกำหนดรูปแบบเดิมเป็นตัวบ่งชี้ให้นักพัฒนาซอฟต์แวร์และผู้ผสานการทำงานทราบว่า API ที่มีอยู่ภายในนั้นเลิกใช้งานแล้ว และแทนที่ด้วย API ใหม่ในปัจจุบัน API เหล่านี้เป็นตัวแทนของ API ปัจจุบันก่อนหน้านี้
API ที่ระบุจึงจะหายไปทั้งหมดใน Weave SDK เวอร์ชันหลักครั้งถัดไป ดังนั้น นักพัฒนาซอฟต์แวร์และผู้ผสานรวมระบบควรกำหนดแผนการย้ายข้อมูลออกจาก API เหล่านี้หากตั้งใจที่จะก้าวตามระดับชั้นนำของรุ่น Weave SDK
วงจร Namespace ที่มีการจัดการ
รูปต่อไปนี้แสดงวงจรของเนมสเปซที่มีการจัดการเมื่อเปลี่ยนจากโหมดการพัฒนาและอาจเป็นแบบเดิม
.-------------. .- - - . .- - - - -. .--------. | Development | -.-> Next -.-> Current ---> | Legacy | '-------------' | '- - - ' | ' - - - - ' '--------' | | '-------------'
หากมีการใช้งาน วงจรของเนมสเปซที่มีการจัดการจะเริ่มต้นด้วยการกำหนด "การพัฒนา"
เมื่อการพัฒนาเสร็จสมบูรณ์และโค้ดพร้อมสำหรับการประเมินและผสานรวมแล้ว การกำหนดจะย้ายไปยัง "ถัดไป" หรือ "ปัจจุบัน" อีกทางเลือกหนึ่งคือ การกำหนดอาจถูกยกเลิกทั้งหมดและไม่มีการใช้งานเนมสเปซที่มีการจัดการอีกต่อไป ทำให้การระบุปัจจุบันอย่างชัดเจนโดยปริยาย
หากโค้ดอยู่ระหว่างใช้งานและยังไม่ได้แทนที่โค้ดปัจจุบัน การกำหนดโค้ดควรย้ายข้อมูลไปยัง "ถัดไป" หากโค้ดเป็นการแทนที่โค้ดปัจจุบัน การกำหนดรหัสควรย้ายข้อมูลไปยังเวอร์ชันปัจจุบัน
ใช้การกำหนดสถานะถัดไป หลังจากที่โค้ดผ่านจำนวนรอบการเผยแพร่และการประเมินที่ต้องการแล้ว การกำหนดจะย้ายไปยัง "ปัจจุบัน" หรือ "การกำหนดสถานะ" อาจถูกยกเลิกไปเลย
หากใช้การกำหนดปัจจุบัน หากโค้ดมีการแทนที่ด้วยโค้ดใหม่ แต่ยังคงต้องมีการดูแลรักษาเป็นเวลาหลายรอบการเผยแพร่ การกำหนดจะย้ายข้อมูลไปยังเวอร์ชันเดิม
แต่จากการระบุสถานะแบบเดิม โค้ดจะถูกนำออกจาก Weave SDK ในที่สุด
การใช้เนมสเปซที่มีการจัดการ
ผู้ใช้ Weave SDK อาจโต้ตอบกับเนมสเปซที่มีการจัดการในฐานะนักพัฒนาซอฟต์แวร์ ขยายและดูแลรักษาโค้ดที่มีอยู่ หรือในฐานะผู้ผสานการทำงานที่ผสานรวม Weave เข้ากับแอปพลิเคชัน แพลตฟอร์ม และโค้ดระบบของตน คำแนะนำแบบละเอียด 2 ส่วนต่อไปนี้มีไว้สำหรับการจัดการเนมสเปซที่มีการจัดการของ Weave จาก 2 มุมมองนี้
การใช้เนมสเปซที่มีการจัดการในฐานะนักพัฒนาซอฟต์แวร์
เป้าหมายหลักของนักพัฒนาซอฟต์แวร์ Weave SDK คือการปรับปรุงและพัฒนา API และฟังก์ชันการทำงานใหม่ๆ ของ Weave SDK API และในหลายๆ กรณี ในเวลาเดียวกันก็สนับสนุนการติดตั้งใช้งาน API และฟังก์ชันต่างๆ ที่มีอยู่ด้วย
ในกรณีที่ไม่สามารถตอบสนองทั้ง 2 ด้านนี้ได้อย่างเข้ากันแบบย้อนหลังภายใน API เดียวกัน เนมสเปซที่มีการจัดการจะมีกลไกในการจัดการ API เหล่านี้พร้อมกันในลักษณะที่ไม่รบกวนการทำให้ API และฟังก์ชันการทำงานที่มีอยู่ใช้งานได้
ตัวอย่างที่ใช้ได้คือ Mercury เป็นโปรไฟล์ Weave ซึ่งปัจจุบันอยู่ภายใต้ลำดับชั้นของเนมสเปซต่อไปนี้ที่ไม่มีการจัดการ
namespace nl { namespace Weave { namespace Profiles { namespace Mercury { // ... }; // namespace Mercury }; // namespace Profiles }; // namespace Weave }; // namespace nl
และส่วนหัวสาธารณะต่อไปนี้
- Weave/Profiles/Mercury/Mercury.hpp
- Weave/Profiles/Mercury/Bar.hpp
- Weave/Profiles/Mercury/Foo.hpp
- Weave/Profiles/Mercury/Foobar.hpp
Mercury.hpp เป็นโมดูล "umbrella" ส่วนหัว ผู้ผสานรวมระบบส่วนใหญ่จะใช้เพียงโมดูล "umbrella" ส่วนหัวตามที่แสดง:
#include
อย่างไรก็ตาม บริษัทพัฒนา Mercury ได้มาถึงจุดที่จำเป็นต้องพัฒนา API รุ่นถัดไป และอาจเป็นโปรโตคอลผ่านสายเคเบิลที่ไม่สามารถใช้ร่วมกับการติดตั้งใช้งานที่มีอยู่เดิมย้อนหลังได้ การใช้เนมสเปซที่มีการจัดการจะช่วยแก้ปัญหานี้ได้โดยไม่ทำให้การทำให้ใช้งานได้ที่มีอยู่เหล่านี้เสียหาย
ย้ายเนมสเปซที่มีอยู่ไปยังเนมสเปซปัจจุบัน
งานแรกคือการย้ายโค้ดปัจจุบันโดยมีเป้าหมายที่จะสนับสนุน API รุ่นปัจจุบันและฟังก์ชันสำหรับการผสานรวมที่ทำให้ใช้งานได้อยู่แล้วต่อไป
% cd src/lib/profiles/mercury % mkdir Current % mv Mercury.hpp Bar.hpp Foo.hpp Foobar.hpp *.cpp Current/
โปรดทราบว่านอกเหนือจากการย้ายไฟล์แล้ว ส่วนหัวรวมถึงการป้องกันสำหรับไฟล์ที่ถูกย้ายควรเปลี่ยนชื่อด้วย ซึ่งอาจตกแต่งไฟล์ด้วย "_CURRENT" เนื่องจากไฟล์ใหม่ที่มีชื่อเหมือนกันจะสร้างขึ้นในตำแหน่งด้านล่าง
เมื่อย้ายโค้ดแล้ว ขั้นตอนถัดไปคือการจัดการเนมสเปซที่มีการกำหนดที่เหมาะสมที่นี่ "ปัจจุบัน" ขั้นแรก ให้สร้างส่วนหัวที่กำหนดเนมสเปซที่มีการจัดการเป็น "Current/MercuryManagedNamespace.hpp" การสร้างส่วนหัวเช่นนี้ ขอแนะนำให้ทำซ้ำและทำซ้ำเนื้อหานี้ในไฟล์ส่วนหัวแต่ละไฟล์เมื่อมีไฟล์ส่วนหัวหลายไฟล์
% cat << EOF > Current/MercuryManagedNamespace.hpp #ifndef _WEAVE_MERCURY_MANAGEDNAMESPACE_CURRENT_HPP #define _WEAVE_MERCURY_MANAGEDNAMESPACE_CURRENT_HPP #include <Weave/Support/ManagedNamespace.hpp> #if defined(WEAVE_CONFIG_MERCURY_NAMESPACE) && WEAVE_CONFIG_MERCURY_NAMESPACE != kWeaveManagedNamespace_Current #error Compiling Weave Mercury current-designation managed namespace file with WEAVE_CONFIG_MERCURY_NAMESPACE defined != kWeaveManagedNamespace_Current #endif #ifndef WEAVE_CONFIG_MERCURY_NAMESPACE #define WEAVE_CONFIG_MERCURY_NAMESPACE kWeaveManagedNamespace_Current #endif namespace nl { namespace Weave { namespace Profiles { namespace WeaveMakeManagedNamespaceIdentifier(Mercury, kWeaveManagedNamespaceDesignation_Current) { }; namespace Mercury = WeaveMakeManagedNamespaceIdentifier(Mercury, kWeaveManagedNamespaceDesignation_Current); }; // namespace Profiles }; // namespace Weave }; // namespace nl #endif // _WEAVE_MERCURY_MANAGEDNAMESPACE_CURRENT_HPP EOF
จากนั้น ให้ใส่ส่วนหัวนี้ก่อนที่จะคำสั่งรวมเฉพาะโมดูลอื่นๆ ในส่วนหัวที่มีอยู่ เช่น
#include#include
สร้างส่วนหัวความเข้ากันได้
อย่างไรก็ตาม การย้ายส่วนหัวที่มีอยู่ไปยังตำแหน่งใหม่และจัดการเนมสเปซเพียงอย่างเดียวนั้นไม่เพียงพอที่จะทำให้การใช้งานที่มีอยู่จะทำงานโดยไม่มีการเปลี่ยนแปลง เนื่องจากทั้งหมดนี้ใช้คำสั่ง include ที่ระบุส่วนหัวที่เพิ่งย้ายไปอยู่ด้านบน
หากต้องการแก้ไขปัญหานี้ คุณต้องสร้างส่วนหัว Wrapper ความเข้ากันได้กับชื่อที่ตรงกับชื่อที่เพิ่งย้าย
% touch Mercury.hpp Bar.hpp Foo.hpp Foobar.hpp
หากมีการสร้างเฉพาะเนมสเปซที่มีการจัดการซึ่งมีการระบุในปัจจุบัน โดยไม่สร้างเนมสเปซที่มีการจัดการซึ่งกำหนดการพัฒนาหรือการกำหนดถัดไปเพื่อประกอบเข้ากับเนมสเปซดังกล่าว เนื้อหาของไฟล์เหล่านี้จะประกอบด้วยส่วนหัวที่มี guard และคำสั่ง include ที่ระบุส่วนหัวที่ย้ายใหม่ซึ่งมีชื่อเดียวกัน
#ifndef _WEAVE_MERCURY_BAR_HPP #define _WEAVE_MERCURY_BAR_HPP #include#endif // _WEAVE_MERCURY_BAR_HPP
อย่างไรก็ตาม หากมีการสร้างเนมสเปซที่มีการจัดการซึ่งกำหนดการพัฒนาหรือ "ถัดไป" เพื่อรองรับการพัฒนาซอฟต์แวร์ใหม่ที่ไม่สามารถใช้ร่วมกันได้ จะต้องมีการดำเนินการที่ซับซ้อนมากขึ้นเล็กน้อย
เช่นเคย ส่วนหัวสำหรับการกำหนดค่าเนมสเปซที่มีการจัดการจะสร้างขึ้นในชื่อ MercuryManagedNamespace.hpp เราขอแนะนำให้ดำเนินการซ้ำหรือทำซ้ำเนื้อหานี้ในไฟล์ส่วนหัวแต่ละไฟล์เมื่อมีไฟล์ส่วนหัวหลายไฟล์
% cat << EOF > MercuryManagedNamespace.hpp #ifndef _WEAVE_MERCURY_MANAGEDNAMESPACE_HPP #define _WEAVE_MERCURY_MANAGEDNAMESPACE_HPP #include <Weave/Support/ManagedNamespace.hpp> #if defined(WEAVE_CONFIG_MERCURY_NAMESPACE) \ && (WEAVE_CONFIG_MERCURY_NAMESPACE != kWeaveManagedNamespace_Current) \ && (WEAVE_CONFIG_MERCURY_NAMESPACE != kWeaveManagedNamespace_Development) #error "WEAVE_CONFIG_MERCURY_NAMESPACE defined, but not as namespace kWeaveManagedNamespace_Current or kWeaveManagedNamespace_Development" #endif #if !defined(WEAVE_CONFIG_MERCURY_NAMESPACE) #define WEAVE_CONFIG_MERCURY_NAMESPACE kWeaveManagedNamespace_Current #endif #endif // _WEAVE_MERCURY_MANAGEDNAMESPACE_HPP EOF
โปรดทราบว่าค่าเริ่มต้นนี้จะกำหนดเนมสเปซที่มีการจัดการเป็น "ปัจจุบัน" ได้ตามต้องการ ถ้าไม่ได้กำหนดการกำหนดค่าไว้
เมื่อใช้ส่วนหัวนี้ คุณจะสามารถแก้ไขส่วนหัว Wrapper ความเข้ากันได้ให้มีสิ่งต่อไปนี้
#include#if WEAVE_CONFIG_MERCURY_NAMESPACE == kWeaveManagedNamespace_Development #include #else #include #endif // WEAVE_CONFIG_MERCURY_NAMESPACE == kWeaveManagedNamespace_Development
หรืออะไรก็ตามที่เหมาะสำหรับกรณีการใช้งานการจัดการเนมสเปซที่มีอยู่
สร้างเนื้อหาการพัฒนา
ในตอนนี้ โครงสร้างพื้นฐานพร้อมแล้วที่จะเริ่มสร้างฟังก์ชันการทำงานและ API ใหม่ควบคู่ไปกับ API ที่มีอยู่
% mkdir Development % touch Development/Mercury.hpp Development/Bar.hpp Development/Foo.hpp Development/Foobar.hpp % cat << EOF > Development/MercuryManagedNamespace.hpp #ifndef _WEAVE_MERCURY_MANAGEDNAMESPACE_DEVELOPMENT_HPP #define _WEAVE_MERCURY_MANAGEDNAMESPACE_DEVELOPMENT_HPP #include <Weave/Support/ManagedNamespace.hpp> #if defined(WEAVE_CONFIG_MERCURY_NAMESPACE) && WEAVE_CONFIG_MERCURY_NAMESPACE != kWeaveManagedNamespace_Development #error Compiling Weave Mercury development-designated managed namespace file with WEAVE_CONFIG_MERCURY_NAMESPACE defined != kWeaveManagedNamespace_Development #endif #ifndef WEAVE_CONFIG_MERCURY_NAMESPACE #define WEAVE_CONFIG_MERCURY_NAMESPACE kWeaveManagedNamespace_Development #endif namespace nl { namespace Weave { namespace Profiles { namespace WeaveMakeManagedNamespaceIdentifier(Mercury, kWeaveManagedNamespaceDesignation_Development) { }; namespace Mercury = WeaveMakeManagedNamespaceIdentifier(Mercury, kWeaveManagedNamespaceDesignation_Development); }; // namespace Profiles }; // namespace Weave }; // namespace nl #endif // _WEAVE_MERCURY_MANAGEDNAMESPACE_DEVELOPMENT_HPP EOF
แน่นอนว่าถ้าโมดูลมีความเรียบง่ายกว่าตัวอย่างที่แสดงในที่นี้ และไม่มีคลาส แหล่งที่มา ไฟล์ หรือส่วนหัวจำนวนมาก ทั้งหมดนี้สามารถทำได้ในไฟล์ส่วนหัวเดียวกันโดยไม่ต้องย้ายไฟล์ไปมา และสร้างส่วนหัวการกำหนดค่าและส่วนหัวความเข้ากันได้แบบสแตนด์อโลนหลายรายการ อย่างไรก็ตาม เมื่อใช้ตัวอย่างที่ซับซ้อนนี้ โซลูชันนี้ควรเป็นโซลูชันเนมสเปซที่มีการจัดการซึ่งมีหลายระดับ ตั้งแต่แบบซับซ้อนไปจนถึงเรียบง่าย
การใช้เนมสเปซที่มีการจัดการเป็นผู้ผสานรวม
จุดสำคัญของผู้ผสานรวม Weave SDK คือการรวมส่วนหัว API สาธารณะของ Weave SDK ที่เหมาะสม และการผสานรวมและพัฒนาแอปพลิเคชันกับส่วนหัวเหล่านี้
ตัวอย่างที่ใช้ได้คือ Mercury เป็นโปรไฟล์ของ Weave ที่มีเนมสเปซที่มีการจัดการซึ่งกำหนดเป็น Next-, Current- และ Legacy ซึ่งมีส่วนหัวสาธารณะดังนี้
- Weave/Profiles/Mercury/Mercury.hpp
- Weave/Profiles/Mercury/Bar.hpp
- Weave/Profiles/Mercury/Foo.hpp
- Weave/Profiles/Mercury/Foobar.hpp
- Weave/Profiles/Mercury/Next/Mercury.hpp
- Weave/Profiles/Mercury/Next/Bar.hpp
- Weave/Profiles/Mercury/Next/Foo.hpp
- Weave/Profiles/Mercury/Next/Foobar.hpp
- Weave/Profiles/Mercury/Current/Mercury.hpp
- Weave/Profiles/Mercury/Current/Bar.hpp
- Weave/Profiles/Mercury/Current/Foo.hpp
- Weave/Profiles/Mercury/Current/Foobar.hpp
- Weave/Profiles/Mercury/Legacy/Mercury.hpp
- Weave/Profiles/Mercury/Legacy/Bar.hpp
- Weave/Profiles/Mercury/Legacy/Foo.hpp
- Weave/Profiles/Mercury/Legacy/Foobar.hpp
Mercury.hpp เป็นโมดูล "umbrella" ส่วนหัว
เว้นแต่กรณีที่ Use Case นั้นกระตุ้นให้รวมโมดูลเนมสเปซที่มีการจัดการภายใน Weave อย่างชัดเจน ตัวอย่างเช่น
#include
วิธีที่ดีที่สุดคือการอ้างอิงส่วนหัวสาธารณะของโมดูล Weave ตามเส้นทางที่เป็นค่าเริ่มต้นที่ไม่มีการจัดการ (เช่น Weave/Profiles/Mercury/Mercury.hpp) การทำเช่นนี้จะช่วยให้เกิดการพัฒนา API อย่างต่อเนื่องโดยไม่ต้องเปลี่ยนคำสั่งของโปรเจ็กต์อย่างต่อเนื่องเมื่อ API เหล่านั้นไหลผ่านวงจรที่มีการจัดการ
เมื่อทำตามกลยุทธ์นี้แล้ว การทำให้ใช้งานได้จะสามารถกำหนดเป้าหมายโค้ดใหม่ในการกำหนดเนมสเปซที่มีการจัดการแบบอื่น เช่น การระบุปัจจุบัน โดยระบุการกำหนดค่าที่ต้องการในตัวประมวลผล C/C++ ล่วงหน้า ซึ่งสามารถดำเนินการในบรรทัดคำสั่ง ในซอร์สโค้ด หรือในส่วนหัวของการกำหนดค่าหรือคำนำหน้า ดังนี้
#define WEAVE_CONFIG_MERCURY_NAMESPACE kWeaveManagedNamespace_Current
และใช้เส้นทาง include ที่ไม่มีการจัดการ / ไม่เข้าเกณฑ์ ดังนี้
#include
เมื่อใดและในกรณีที่การกำหนดเนมสเปซที่มีการจัดการมีการเปลี่ยนแปลงสำหรับ API เป้าหมาย เช่น จากปัจจุบันเป็นแบบเดิม เพียงกำหนดเป้าหมายใหม่โดยการปรับคำจำกัดความของผู้ประมวลผลข้อมูลล่วงหน้าดังนี้
#define WEAVE_CONFIG_MERCURY_NAMESPACE kWeaveManagedNamespace_Legacy