बेलेव्यू, वॉशिंगटन में, ऊकाज़ ऐन्फ़ोरोविच का एपिसोड 24: (अगस्त 2021)
पिछले एपिसोड
क्या आपको नीचे दिए गए कोड में गड़बड़ी मिली? क्या आप गड़बड़ी एक कोड समीक्षा में, कॉलसाइट देखते समय?
Token CreateToken(int command_data, int buffer_id);
...
auto token = CreateToken(GetCommandBufferId(), GetCommandData());
कभी-कभी एक ही टाइप, काम न करने वाले डोमेन से वैल्यू दिखा सकता है.
आम तौर पर, ऐसा पूर्णांक या स्ट्रिंग जैसे गैर-खास डेटा टाइप के साथ होता है.
ऊपर दिया गया उदाहरण बताता है कि इससे किस तरह गड़बड़ियां हो सकती हैं.
अच्छी बात यह है कि Chromium के //base
से, अश्लील और अलग-अलग तरह के एलिमेंट आसानी से दिखाए जा सकते हैं:
#include "base/types/strong_alias.h"
// The first template argument of StrongAlias is a "tag" type.
// The "tag" type is used to distinguish between different
// StrongAlias types.
using CommandData = base::StrongAlias<class CommandDataTag, int>;
using CommandBufferId = base::StrongAlias<class CommandBufferIdTag, int>;
Token CreateToken(CommandData command_data, CommandBufferId buffer_id);
अलग-अलग टाइप से, टेक्स्ट को पढ़ना आसान हो जाता है.
इसके अलावा, StrongAlias
, कंपाइल के समय टाइप मिक्स-अप को कैच करता है:
test.cc:456:16: error: no matching function for call to 'CreateToken'
auto token = CreateToken(GetCommandBufferId(), GetCommandData());
^~~~~~~~~~~
test.cc:123:7: note: candidate function not viable: no known conversion from
'StrongAlias<class CommandBufferIdTag, [...]>' to
'StrongAlias<class CommandDataTag, [...]>' for 1st argument
Token CreateToken(CommandData command_data, CommandBufferId buffer_id);
^
कंपाइलर देखता है कि ये टाइप काम नहीं करते हैं,
क्योंकि उनमें एक अलग "टैग" है टाइप करें.
StrongAlias
"टैग" के रूप में कोई भी प्रकार स्वीकार करता है टाइप करें.
उदाहरण दिखाता है कि "टैग" यहां तक कि कहीं भी टाइप डेफ़िनिशन की ज़रूरत नहीं है
गैर-मौजूद क्लास की घोषणा ठीक से की जा सकती है.
आने वाले समय में, किसी खास टाइप के बजाय (उदाहरण के लिए, bool, int, a स्ट्रिंग) इन विकल्पों पर विचार करें:
- आइडेंटिफ़ायर के तौर पर
int32_t
का इस्तेमाल करने के बजाय,base::IdType32<TagType>
का इस्तेमाल करें. - सामान्य
base::UnguessableToken
के बजाय,base::TokenType<TagType>
का इस्तेमाल करें. - बूल के बजाय enum क्लास का इस्तेमाल करें
(उदाहरण के लिए,
kForReload
,true
के बजायkNotForReload
,false
). - अन्य गैर-खास प्रकारों को
base::StrongAlias<TagType, SomeWrappedType>
से बदलें.