Model Data Debugger C++ Antarmuka Tambahan
Topik ini menjelaskan beberapa antarmuka tambahan yang terkait dengan Model Data Debugger C++, seperti metadata, konsep, dan enumerasi objek.
Antarmuka Metadata Model Data Debugger
Salah satu gagasan inti dalam model data adalah bahwa objek (terutama yang sintetis) adalah kamus tuple kunci/nilai/metadata. Setiap kunci dapat memiliki seluruh penyimpanan metadata yang terkait dengannya yang menggambarkan berbagai hal di sekitar kunci dan nilai potensialnya. Perhatikan bahwa metadata tidak, dengan cara apa pun, mengubah nilai kunci. Ini hanya informasi tambahan yang terkait dengan kunci dan nilainya yang dapat memengaruhi presentasi atau atribut terkait lainnya dari kunci dan nilainya.
Dalam beberapa pengertian, penyimpanan metadata tidak semuanya berbeda dari tuple kunci/nilai/metadata yang merupakan esensi objek dalam model data. Namun, ini disederhanakan dari tampilan ini. Penyimpanan metadata diwakili oleh antarmuka IKeyStore. Meskipun juga kumpulan tuple kunci/nilai/metadata, ada batasan untuk apa yang dapat dilakukan dengan penyimpanan kunci metadata versus objek model:
- Penyimpanan kunci hanya dapat memiliki satu penyimpanan induk -- tidak dapat memiliki rantai model induk yang segan-segan.
- Penyimpanan kunci tidak memiliki konsep. Ini hanya dapat memiliki kamus tuple kunci/nilai/metadata. Ini berarti bahwa kunci yang ada di penyimpanan kunci statis. Mereka tidak dapat dibuat sesuai permintaan oleh sistem bahasa dinamis.
- Berdasarkan konvensi saja, nilai dalam penyimpanan kunci yang ditentukan metadata dibatasi untuk nilai dasar (intrinsik dan aksesor properti)
Meskipun penyimpanan kunci dapat memiliki angka arbitrer (dan penamaan arbitrer) kunci, ada nama tertentu yang telah menentukan nilai semantik. Saat ini, nama-nama tersebut adalah:
Nama Kunci | Jenis Nilai | Deskripsi |
---|---|---|
PreferredRadix | Bilangan bulat: 2, 8, 10, atau 16 | Menunjukkan nilai ordinal radix apa yang harus ditampilkan |
Format Pilihan | Bilangan bulat: seperti yang didefinisikan oleh enumerasi PreferredFormat | Menunjukkan jenis pemformatan pilihan untuk tampilan nilai |
PreferredLength | Bilangan bulat | Untuk array dan kontainer lainnya, menunjukkan berapa banyak elemen yang harus ditampilkan secara default |
FindDerivation | Boolean | Menunjukkan apakah host debug harus melakukan analisis jenis turunan pada nilai sebelum menggunakan (misalnya: menampilkan) |
Bantuan | String | Gaya tips alat membantu teks untuk kunci yang dapat disajikan oleh antarmuka pengguna dengan cara yang sangat membantu. |
ActionName | String | Menunjukkan bahwa metode yang diberikan (yang tidak mengambil argumen dan tidak mengembalikan nilai) adalah tindakan. Nama tindakan ditentukan dalam metadata. Antarmuka pengguna dapat menggunakan nama ini untuk menyajikan opsi di menu konteks atau antarmuka lain yang sesuai |
ActionIsDefault | Boolean | Hanya valid jika kunci ActionName ditentukan, menunjukkan bahwa ini adalah tindakan default untuk objek. |
ActionDescription | String | Hanya valid jika kunci ActionName ditentukan, ini memberikan deskripsi gaya tips alat untuk tindakan tersebut. Teks tersebut dapat disajikan oleh antarmuka pengguna dengan cara yang sangat membantu. |
Perhatikan bahwa sementara kunci di penyimpanan metadata dapat memiliki metadata mereka sendiri (infiniteum iklan), saat ini tidak ada penggunaan untuk itu. Sebagian besar penelepon akan menentukan null untuk parameter metadata apa pun dalam metode pada antarmuka IKeyStore.
Antarmuka Metadata Inti: IKeyStore
Antarmuka IKeyStore didefinisikan sebagai berikut:
DECLARE_INTERFACE_(IKeyStore, IUnknown)
{
STDMETHOD(GetKey)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(SetKey)(_In_ PCWSTR key, _In_opt_ IModelObject* object, _In_opt_ IKeyStore* metadata) PURE;
STDMETHOD(GetKeyValue)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(SetKeyValue)(_In_ PCWSTR key, _In_ IModelObject* object) PURE;
STDMETHOD(ClearKeys)() PURE;
}
Metode GetKey dianalogikan dengan metode GetKey pada IModelObject. Ini akan mengembalikan nilai kunci yang ditentukan jika ada di penyimpanan kunci atau penyimpanan induk penyimpanan kunci. Perhatikan bahwa jika nilai kunci adalah aksesor properti, metode GetValue tidak akan dipanggil pada aksesor properti. IModelPropertyAccessor aktual yang dikotak ke dalam IModelObject akan dikembalikan. Biasanya klien akan memanggil GetKeyValue karena alasan ini.
Metode SetKey dianalogikan dengan metode SetKey pada IModelObject. Ini adalah satu-satunya metode yang mampu membuat kunci dan mengaitkan metadata dengannya dalam penyimpanan kunci.
Metode GetKeyValue adalah metode pertama yang akan dituju klien untuk menemukan nilai kunci tertentu dalam penyimpanan metadata. Jika kunci yang ditentukan oleh argumen kunci ada di dalam penyimpanan (atau penyimpanan induk), nilai kunci tersebut dan metadata apa pun yang terkait dengannya akan dikembalikan. Jika nilai kunci adalah pengakses properti (IModelPropertyAccessor yang dikemas ke dalam IModelObject), metode GetValue dari pengakses properti akan secara otomatis dipanggil oleh GetKeyValue dan nilai yang mendasar dari properti yang dikembalikan.
Metode SetKeyValue dianalogikan dengan metode SetKeyValue pada IModelObject. Metode ini tidak mampu membuat kunci baru dalam penyimpanan metadata. Jika ada kunci yang ada seperti yang ditunjukkan oleh argumen kunci, nilainya akan diatur seperti yang ditunjukkan. Jika kunci adalah aksesor properti, metode SetValue akan dipanggil pada aksesor properti untuk mengatur nilai yang mendasar. Perhatikan bahwa metadata biasanya statis setelah dibuat. Penggunaan metode ini pada penyimpanan kunci metadata harus jarang.
Metode ClearKeys dianalogikan dengan metode ClearKeys pada IModelObject. Ini akan menghapus setiap kunci dari penyimpanan metadata yang diberikan. Metode ini tidak berpengaruh pada penyimpanan induk mana pun.
Enumerasi Objek dalam Model Data
Menghitung Objek dalam Model Data
Ada dua antarmuka enumerasi kunci inti dalam model data: IKeyEnumerator dan IRawEnumerator. Meskipun ini adalah dua antarmuka inti, mereka dapat digunakan untuk menghitung objek dalam salah satu dari tiga gaya:
Kunci - Antarmuka IKeyEnumerator dapat diperoleh melalui panggilan ke EnumerateKeys untuk menghitung kunci objek dan nilai/metadatanya tanpa menyelesaikan aksesor properti yang mendasar. Gaya enumerasi ini dapat mengembalikan nilai IModelPropertyAccessor mentah yang dikotak ke dalam IModelObjects.
Nilai - Antarmuka IKeyEnumerator dan IRawEnumerator dapat diperoleh melalui panggilan ke EnumerateKeyValues atau EnumerateRawValues untuk menghitung kunci/nilai mentah pada objek dan nilai/metadatanya. Setiap aksesor properti yang ada dalam enumerasi secara otomatis diselesaikan melalui panggilan ke metode GetValue yang mendasar selama enumerasi tersebut.
Referensi - Antarmuka IKeyEnumerator dan IRawEnumerator dapat diperoleh melalui panggilan ke EnumerateKeyReferences atau EnumerateRawReferences untuk menghitung referensi ke kunci/nilai mentah pada objek. Referensi tersebut dapat disimpan dan nantinya digunakan untuk mendapatkan atau mengatur kunci atau nilai mentah yang mendasar.
KeyEnumerator: Enumerasi kunci sintetis
Antarmuka IKeyEnumerator adalah antarmuka tunggal untuk enumerasi semua kunci (berdasarkan kunci, nilai, atau referensi) dalam objek instans dan semua model induk terkait dalam rantai model induknya. Antarmuka didefinisikan sebagai berikut:
DECLARE_INTERFACE_(IKeyEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_Out_ BSTR* key, _COM_Errorptr_opt_ IModelObject** value, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
}
Metode Reset mengatur ulang enumerator ke posisi saat pertama kali diperoleh (misalnya: sebelum elemen pertama dalam enumerasi). Panggilan berikutnya ke GetNext akan mengembalikan kunci enumerasi pertama.
Metode GetNext memindahkan enumerator ke depan dan mengembalikan kunci pada posisi tersebut dalam enumerasi.
IRawEnumerator: Enumerasi konstruksi bahasa asli atau dasar (C/C++)
Antarmuka IRawEnumerator adalah antarmuka tunggal untuk enumerasi semua konstruksi asli/bahasa (berdasarkan nilai atau referensi) dalam objek yang mewakili konstruksi asli dalam ruang alamat target debug. Antarmuka didefinisikan sebagai berikut:
DECLARE_INTERFACE_(IRawEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_Out_opt_ BSTR* name, _Out_opt_ SymbolKind *kind, _COM_Errorptr_opt_ IModelObject** value) PURE;
}
Metode Reset mengatur ulang enumerator ke posisi saat pertama kali diperoleh (misalnya: sebelum elemen pertama dalam enumerasi). Panggilan berikutnya ke GetNext akan mengembalikan konstruksi asli/bahasa enumerasi pertama.
Metode GetNext memindahkan enumerator ke depan dan mengembalikan konstruksi asli/bahasa pada posisi tersebut dalam enumerasi.
Lihat juga
Topik ini adalah bagian dari seri yang menjelaskan antarmuka yang dapat diakses dari C++, cara menggunakannya untuk membangun ekstensi debugger berbasis C++, dan cara menggunakan konstruksi model data lainnya (misalnya: JavaScript atau NatVis) dari ekstensi model data C++.
Gambaran Umum Debugger Data Model C++
Antarmuka C++ Model Data Debugger
Model Data Debugger C++ Antarmuka Tambahan