The Chromium Chronicle #24: StrongAlias, IdType, এবং TokenType

পর্ব 24: Bellevue, WA-তে Łukasz Anforowicz দ্বারা (আগস্ট, 2021)
আগের পর্বগুলো

আপনি নীচের কোডে বাগ খুঁজে পেতে পারেন? শুধুমাত্র কলসাইট দেখার সময় আপনি কি কোড রিভিউতে বাগ দেখতে পাবেন?

Token CreateToken(int command_data, int buffer_id);
...
auto token = CreateToken(GetCommandBufferId(), GetCommandData());

একই ধরনের কখনও কখনও বেমানান ডোমেন থেকে মান প্রতিনিধিত্ব করতে পারে. এটি সাধারণত পূর্ণসংখ্যা বা স্ট্রিংয়ের মতো অ-নির্দিষ্ট ডেটা প্রকারের জন্য ঘটে। উপরের উদাহরণটি ব্যাখ্যা করে যে এটি কীভাবে বাগ সৃষ্টি করতে পারে। সৌভাগ্যবশত, ক্রোমিয়ামের //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 ​​যেকোনো প্রকারকে "ট্যাগ" টাইপ হিসাবে গ্রহণ করে। উদাহরণটি দেখায় যে "ট্যাগ" টাইপের কোথাও টাইপ সংজ্ঞারও প্রয়োজন নেই—একটি অ-অস্তিত্বহীন শ্রেণীর একটি ইন-প্লেস ফরওয়ার্ড ঘোষণা ভাল কাজ করে।

ভবিষ্যতে, একটি অ-নির্দিষ্ট প্রকারের পরিবর্তে (উদাহরণস্বরূপ, একটি বুল, একটি int, একটি স্ট্রিং), এই বিকল্পগুলি বিবেচনা করুন:

  • একটি শনাক্তকারী হিসাবে int32_t ব্যবহার করার পরিবর্তে base::IdType32<TagType> ব্যবহার করুন।
  • একটি অ-নির্দিষ্ট base::UnguessableToken এর পরিবর্তে base::TokenType<TagType> ব্যবহার করুন।
  • একটি bool এর পরিবর্তে একটি enum ক্লাস ব্যবহার করুন (উদাহরণস্বরূপ, kForReload , kNotForReload true , false এর পরিবর্তে)।
  • অন্যান্য অ-নির্দিষ্ট প্রকারগুলিকে base::StrongAlias<TagType, SomeWrappedType>