เนมสเปซที่มีการจัดการ

สรุป

เกริ่นนำ

เนมสเปซที่มีการจัดการจะใช้ใน Weave SDK เพื่อให้ทั้งนักพัฒนาซอฟต์แวร์และผู้ผสานงาน Weave SDK รวมถึงคำแนะนำและข้อความย่อยที่โฆษณาเกี่ยวกับการกำหนดชุด API หนึ่งๆ ภายใน SDK เพื่อวางแผนและคาดการณ์เส้นทางการย้ายข้อมูลในรุ่น Weave SDK และอาจจัดการ Weave API หลายรายการพร้อมกันสำหรับโมดูลหนึ่งๆ ได้

การระบุ

เนมสเปซที่มีการจัดการอาจได้รับการจัดการเป็นแบบใดแบบหนึ่งจาก 4 แบบ ดังนี้

การพัฒนา

เนมสเปซที่จัดการด้วยการกำหนดการพัฒนาจะเป็นตัวบ่งชี้ถึงนักพัฒนาซอฟต์แวร์และผู้รวมระบบว่า API ที่อยู่ภายในอยู่ระหว่างการพัฒนา อาจมีการเปลี่ยนแปลงและไม่รองรับอย่างเป็นทางการ โดยทั่วไป ผู้รวมไม่แนะนำให้ใช้ API เหล่านี้ เว้นแต่จะมีคำสั่งเฉพาะให้ใช้

ถัดไป

เนมสเปซที่จัดการด้วยการกำหนด Next เป็นเครื่องบ่งชี้ให้นักพัฒนาซอฟต์แวร์และผู้รวมระบบทราบว่า 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 ต่อไป

วงจรการใช้งานเนมสเปซที่มีการจัดการ

รูปต่อไปนี้แสดงวงจรของเนมสเปซที่มีการจัดการเมื่อมีการเปลี่ยนแปลงจากเวอร์ชันที่กำลังพัฒนาและ (หรืออาจเป็นเวอร์ชันเดิม)

.-------------.      .- - - .      .- - - - -.      .--------.
| Development | -.->   Next   -.->   Current   ---> | Legacy |
'-------------'  |   '- - - '  |   ' - - - - '      '--------'
                 |             |
                 '-------------'

หากมีการใช้ วงจรเนมสเปซที่มีการจัดการจะเริ่มต้นด้วยการกำหนดการพัฒนา

เมื่อการพัฒนาเสร็จสมบูรณ์และโค้ดพร้อมสำหรับการประเมินและผสานรวมแล้ว การกำหนดนั้นจะย้ายไปยัง "ถัดไป" หรือ "ปัจจุบัน" หรือระบบอาจละเว้นการกำหนดทั้งหมดและเลิกใช้เนมสเปซที่มีการจัดการอีกต่อไป ทำให้การกำหนดเป็นสถานะปัจจุบันโดยปริยาย

หากโค้ดจะอยู่ข้างๆ และยังไม่ได้แทนที่โค้ดปัจจุบัน การกำหนดดังกล่าวควรย้ายไปยัง Next หากโค้ดคือการแทนที่โค้ดปัจจุบัน การระบุสถานะควรย้ายข้อมูลไปยังส่วนปัจจุบัน

เมื่อใช้การกำหนด Next หลังจากที่โค้ดมีรอบการเผยแพร่และการประเมินผลครบตามจำนวนที่ต้องการแล้ว การกำหนดนั้นจะย้ายไปยังส่วนปัจจุบัน มิเช่นนั้นอาจมีการเลิกใช้การระบุทั้งหมด

เมื่อใช้การกําหนดปัจจุบัน หากโค้ดใหม่ต้องใช้โค้ดใหม่ แต่ยังต้องดูแลเป็นเวลาหลายรอบการเผยแพร่ การกําหนดดังกล่าวจะย้ายข้อมูลไปยัง "เดิม"

เมื่อมีการกำหนดเวอร์ชันเดิม โค้ดดังกล่าวจะถูกนำออกจาก Weave SDK ทั้งหมด

การใช้เนมสเปซที่มีการจัดการ

ผู้ใช้ Weave SDK อาจโต้ตอบกับเนมสเปซที่มีการจัดการในฐานะนักพัฒนาซอฟต์แวร์ การขยายและดูแลรักษาโค้ดที่มีอยู่ หรือเป็นผู้ผสานการทำงานซึ่งผสานรวม Weave เข้ากับแอปพลิเคชัน แพลตฟอร์ม และโค้ดระบบของตนเอง ทำตามคำแนะนำโดยละเอียดทั้ง 2 ส่วนต่อไปนี้เพื่อจัดการกับเนมสเปซที่จัดการโดย Weave จากทั้ง 2 มุมมอง

การใช้เนมสเปซที่มีการจัดการในฐานะนักพัฒนาซอฟต์แวร์

จุดมุ่งเน้นสำคัญของนักพัฒนาซอฟต์แวร์ Weave SDK คือการปรับปรุงและพัฒนา API และฟังก์ชันของ Weave SDK ในขณะเดียวกันในหลายๆ กรณี ก็ยังรองรับการทำให้ API และฟังก์ชันการทำงานที่มีอยู่ใช้งานได้ไปพร้อมกันด้วย

ในกรณีที่ไม่สามารถตอบสนองทั้ง 2 ด้านที่โฟกัสได้แบบย้อนหลังภายใน API เดียวกัน เนมสเปซที่มีการจัดการมีกลไกในการจัดการ API เหล่านี้พร้อมกันในลักษณะที่จะไม่ขัดขวางการทำให้ API ที่มีอยู่และการทำให้ฟังก์ชันใช้งานได้

สำหรับตัวอย่างที่ใช้งานได้ สมมติว่ามีโปรไฟล์ Weave ชื่อว่า Mercury ซึ่งในปัจจุบันอยู่ภายใต้ลำดับชั้นเนมสเปซที่ไม่มีการจัดการดังต่อไปนี้

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 คือส่วนหัว "ร่ม" ของโมดูล ผู้ผสานการทำงานส่วนใหญ่จะรวมส่วนหัว "ร่ม" ของโมดูล ดังตัวอย่างต่อไปนี้

#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 

#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 

สร้างส่วนหัวที่เข้ากันได้

อย่างไรก็ตาม การย้ายส่วนหัวที่มีอยู่ไปยังตำแหน่งใหม่และจัดการเนมสเปซอย่างเดียวนั้นไม่เพียงพอที่จะตรวจสอบว่าการทำให้ใช้งานได้ที่มีอยู่จะทำงานโดยไม่มีการเปลี่ยนแปลง เนื่องจากทั้งหมดใช้คำสั่ง 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 

#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 

#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 ที่เหมาะสม และการผสานรวมและพัฒนาแอปพลิเคชันกับส่วนหัวเหล่านี้

สำหรับตัวอย่างที่ใช้งานได้ สมมติอีกครั้งคือโปรไฟล์ Weave ที่ชื่อว่า Mercury ซึ่งมีเนมสเปซที่จัดการซึ่งกำหนดเป็น "ถัดไป" "ปัจจุบัน" และ "เดิม" ซึ่งมีโครงสร้างส่วนหัวสาธารณะดังนี้

  • 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 คือส่วนหัว "ร่ม" ของโมดูล

ยกเว้นกรณีที่กรณีการใช้งานในมือมีแรงจูงใจในการรวมโมดูลเนมสเปซที่มีการจัดการภายใน Weave อย่างชัดแจ้ง ตัวอย่างเช่น

#include 

วิธีที่ดีที่สุดคือการอ้างอิงส่วนหัวสาธารณะของโมดูล Weave ตามเส้นทางเริ่มต้นที่ไม่มีการจัดการ (เช่น Weave/Profiles/Mercury/Mercury.hpp) การทำเช่นนี้จะช่วยให้มีการพัฒนา API ต่อไปโดยไม่ต้องเปลี่ยนแปลงคำสั่ง include ของโปรเจ็กต์อย่างต่อเนื่องเมื่อ API เหล่านั้นไหลผ่านlifecycleที่มีการจัดการ

หลังจากใช้กลยุทธ์นี้ การทำให้ใช้งานได้จะสามารถกำหนดเป้าหมายโค้ดใหม่ในการกำหนดเนมสเปซที่มีการจัดการอื่น เช่น การกำหนดปัจจุบัน เช่น การระบุการกำหนดค่าที่ต้องการในตัวประมวลผล C/C++ ล่วงหน้า ซึ่งสามารถทำได้ในบรรทัดคำสั่ง ในซอร์สโค้ด หรือในส่วนหัวการกำหนดค่าหรือคำนำหน้า:

#define WEAVE_CONFIG_MERCURY_NAMESPACE kWeaveManagedNamespace_Current

และใช้เส้นทาง "ที่ไม่มีการจัดการ" / "ไม่เข้าเกณฑ์" ดังนี้

#include 

การเปลี่ยนแปลงการกำหนดเนมสเปซที่จัดการสำหรับ API ที่กำหนดเป้าหมายไว้ เช่น จากปัจจุบันเป็นแบบเดิมหรือไม่ และเมื่อใด ให้กำหนดเป้าหมายใหม่โดยการปรับการกำหนดตัวประมวลผลล่วงหน้า ดังนี้

#define WEAVE_CONFIG_MERCURY_NAMESPACE kWeaveManagedNamespace_Legacy