টাইপডেফিংয়ের মতো প্রারম্ভিক টাইপগুলির সাথে কত দূর যেতে হবে


14

আমি অনেকগুলি typedefএস সহ নীচের মতো সি ++ কোড দেখেছি ।

typedefসি ++ আদিম ব্যবহারের বিপরীতে এরকম অনেকগুলি ব্যবহারের সুবিধা কী ? এমন কোনও সুবিধা আছে যা সেই সুবিধাগুলিও অর্জন করতে পারে?

শেষ পর্যন্ত, ডেটা সমস্ত মেমরির মধ্যে সঞ্চয় করা হয় বা তারের উপরে বিট এবং বাইট হিসাবে সঞ্চারিত হয়, এটি কি আসলেই গুরুত্বপূর্ণ?

types.h:

typedef int16_t Version;
typedef int32_t PacketLength;
typedef int32_t Identity;
typedef int32_t CabinetNumber;
typedef int64_t Time64;
typedef int64_t RFID;
typedef int64_t NetworkAddress;
typedef int64_t PathfinderAddress;
typedef int16_t PathfinderPan;
typedef int16_t PathfinderChannel;
typedef int64_t HandsetSerialNumber;
typedef int16_t PinNumber;
typedef int16_t LoggingInterval;
typedef int16_t DelayMinutes;
typedef int16_t ReminderDelayMinutes;
typedef int16_t EscalationDelayMinutes;
typedef float CalibrationOffset;
typedef float AnalogValue;
typedef int8_t PathfinderEtrx;
typedef int8_t DampingFactor;
typedef int8_t RankNumber;
typedef int8_t SlavePort;
typedef int8_t EventLevel;
typedef int8_t Percent;
typedef int8_t SensorNumber;
typedef int8_t RoleCode;
typedef int8_t Hour;
typedef int8_t Minute;
typedef int8_t Second;
typedef int8_t Day;
typedef int8_t Month;
typedef int16_t Year;
typedef int8_t EscalationLevel;

এটি প্রবাহিত হওয়া এড়াতে কোনও নির্দিষ্ট জিনিসটির জন্য সর্বদা একই ধরণের ব্যবহৃত হয় তা নিশ্চিত করে দেখার পক্ষে যুক্তিসঙ্গত বলে মনে হয় তবে আমি প্রায়শই এমন কোড দেখতে পাই যেখানে "ইনট" এর পরিবর্তে সর্বত্র ব্যবহৃত হয়েছে। typedefIng প্রায়ই কোড যা এই যদিও মত একটি বিট দেখায় সীসা করে:

DoSomething(EscalationLevel escalationLevel) {
    ...
}

কোনটি আমাকে তখন অবাক করে তোলে কোন টোকেনটি আসলে প্যারামিটারটি বর্ণনা করছে: প্যারামিটারের ধরন বা প্যারামিটারের নাম?


2
আইএমএইচও, একটি দুর্দান্ত অর্থহীন অনুশীলনের মতো বলে মনে হচ্ছে তবে আমি নিশ্চিত কেউ কেউ অন্যদের সাথে একমত হবে না ...
নিম

1
এই ধরনেরগুলি পরিবর্তনশীল নামের মতো দেখায় look
ক্যাপ্টেন জিরাফি

11
দ্রষ্টব্য যে এটি এই ধারণাটি তৈরি করে যে এটি টাইপ-নিরাপদ, তবে এটি মোটেও নয় - টাইপডেফগুলি কেবলমাত্র এলিয়াস তৈরি করে, তবে কিছুই আপনাকে উদাহরণস্বরূপ কোনও ফাংশনটিতে যেতে বাধা দেয় না Minuteযা টাইপ হিসাবে ঘোষিত একটি যুক্তি রয়েছে Second
জেস্পার

2
@ মার্ক: এটিকে অন্যভাবে দেখুন। আপনি যদি পূর্ণসংখ্যার প্রকারটি সিদ্ধান্ত নিতে কোনও ভুল করেন বা ভবিষ্যতে নতুন প্রয়োজনীয়তা উদ্ভূত হয় এবং তাই আপনি এটি পরিবর্তন করতে চান, আপনি কি কোনও একক টাইপডেফ পরিবর্তন করতে চান বা আপনি যে এক বছরের ব্যবস্থায় কাজ করে প্রতিটি ফাংশনের কোড অনুসন্ধান করতে চান, এবং এর স্বাক্ষর পরিবর্তন? 640 কে কারও পক্ষে যথেষ্ট এবং এগুলি। টাইপিডেফের সাথে সম্পর্কিত বৈপরীত্যটি হ'ল লোকজন দুর্ঘটনাক্রমে বা ইচ্ছাকৃতভাবে কোড লিখেন যা বছরটি ঠিক 16 বিট হয় তার উপর নির্ভর করে, তারপরে এটি পরিবর্তন হয় এবং তাদের কোডটি ভেঙে যায়।
স্টিভ জেসোপ

1
@ স্টিভ জেসোপ: আপনি যদি মনে করেন এটি ভাল বা খারাপ ধারণা: আমি সিদ্ধান্ত নিতে পারছি না :-) প্রথম অংশটি মনে হয়, শেষোক্তটি এর বিপরীতে। আমি অনুমান করি তখন এর পক্ষে মতামত রয়েছে।

উত্তর:


13

প্যারামিটারের নামটির অর্থ কী তা বর্ণনা করা উচিত - আপনার ক্ষেত্রে বাড়ানোর স্তর। প্রকারটি কীভাবে মান উপস্থাপিত হয় - আপনার উদাহরণ হিসাবে টাইপডেফগুলি যুক্ত করে ফাংশন-স্বাক্ষরের এই অংশটি বিস্মৃত হয়, তাই আমি এটির প্রস্তাব দেব না।

টাইপডিফগুলি টেমপ্লেটগুলির জন্য দরকারী বা আপনি যদি নির্দিষ্ট পরামিতিগুলির জন্য ব্যবহৃত প্রকারটি পরিবর্তন করতে চান, উদাহরণস্বরূপ 32 বিবিট থেকে 64 বিবিট প্ল্যাটফর্মে স্থানান্তরিত করার সময়।


এটি তখন সাধারণ sensকমত্য বলে মনে হচ্ছে। তাহলে আপনি কি কেবল "ইনট" এর সাথে লেগে থাকবেন? ডেটা ট্রান্সফারিংয়ের ক্ষেত্রে আমার এই অ্যাপটিতে খুব দক্ষ হতে হবে, তাই সিরিয়ালায়নের সময় এটি কেবল ইন্ট 16_টি (বা কোনও নির্দিষ্ট উপাদানের জন্য সবচেয়ে বড় উপস্থাপনার প্রকারের যাই হোক না কেন) রূপান্তরিত হওয়া উচিত?

@ মার্ক: হ্যাঁ, আপনার এটি করা উচিত। ব্যবহৃত ডেটা-টাইপের আকার প্রকাশ করতে টাইপডেফগুলি ব্যবহার করুন তবে বিভিন্ন প্রসঙ্গে ব্যবহৃত একই ধরণের পার্থক্য করবেন না।
বিজার্ন পোলেক্স

ধন্যবাদ - এবং কেবল পরিষ্কার করার জন্য, আপনি সাধারণত কোডে int এর পরিবর্তে int8_t ব্যবহার করে বিরক্ত করবেন না .. আমি মনে করি আমার মূল উদ্বেগটি "পরিচয়" এর মতো কিছু ছিল যা আসলে একটি ডাটাবেস দ্বারা তৈরি একটি পরিচয়। এই মুহূর্তে এটি 32 বিট তবে আমি এখনও নিশ্চিত নই যে এটি শেষ পর্যন্ত 64৪ বিট হয়ে যেতে পারে কিনা। এছাড়াও, int32_t বনাম ইন্টি সম্পর্কে কীভাবে? কোন int হয় সাধারণত int32_t হিসাবে একই, কিন্তু এটা সবসময় আমি একটি ভিন্ন প্ল্যাটফর্মের উপর অনুমান হবে না হতে পারে? আমি ভাবছি আমার কেবল "ইনট" এর সাথে লেগে থাকা উচিত, এবং "int64_t" যেখানে প্রয়োজনীয় ছিল .. ধন্যবাদ :-)

@ মার্ক: টাইপডেফগুলির মতো গুরুত্বপূর্ণ বিষয়টি int32_tহ'ল বিভিন্ন প্ল্যাটফর্মগুলিতে সংকলন করার সময় আপনাকে সেগুলি সঠিক কিনা তা নিশ্চিত করতে হবে। আপনি যদি Identityকোনও পর্যায়ে পরিসীমা পরিবর্তনের প্রত্যাশা করেন তবে আমি মনে করি যে আমি সমস্ত প্রভাবিত কোডে সরাসরি পরিবর্তনগুলি করতে পছন্দ করব। তবে আমি নিশ্চিত নই, কারণ আপনার নির্দিষ্ট নকশা সম্পর্কে আমার আরও জানতে হবে। আপনি এটি একটি পৃথক প্রশ্ন করতে চাইতে পারেন।
বিজার্ন পোলেক্স

17

প্রথমে আমি "কেন নয়" ভেবেছিলাম তবে তখন আমার কাছে ঘটেছিল যে আপনি যদি এই ধরণের ধরণের দৈর্ঘ্যে যেতে চান তবে ভাষার আরও ভাল ব্যবহার করুন। এলিয়াস ব্যবহার না করে প্রকৃতপক্ষে প্রকারগুলি সংজ্ঞায়িত করুন:

class AnalogueValue
{
public:
    // constructors, setters, getters, etc..
private:
    float m_value;
};

এর মধ্যে পারফরম্যান্সের কোনও পার্থক্য নেই:

typedef float AnalogueValue;
AnalogValue a = 3.0f;
CallSomeFunction (a);

এবং:

AnalogValue a (3.0f); // class version
CallSomeFunction (a);

এবং আপনার কাছে প্যারামিটারের বৈধতা এবং সুরক্ষা টাইপ করার সুবিধা রয়েছে। উদাহরণস্বরূপ, কোডটি বিবেচনা করুন যা আদিম প্রকারগুলি ব্যবহার করে অর্থের সাথে কাজ করে:

float amount = 10.00;
CallSomeFunction(amount);

রাউন্ডিং ইস্যুগুলি বাদ দিয়ে এটি কোনও ধরণের ফ্লোটে রূপান্তর করতে পারে:

int amount = 10;
CallSomeFunction(amount);

এই ক্ষেত্রে এটি কোনও বড় বিষয় নয়, তবে অন্তর্নিহিত রূপান্তরগুলি বাগের উত্স হতে পারে যা পিন করা কঠিন difficult একটি ব্যবহার করা typedefএখানে সহায়তা করে না, যেহেতু তারা নিছক একটি প্রকারের উপনাম।

একটি নতুন ধরণের পুরোপুরি ব্যবহারের অর্থ হ'ল আপনি কোনও ingালাই অপারেটরকে কোড না করা পর্যন্ত কোনও অন্তর্নিহিত রূপান্তর নেই, এটি একটি খারাপ ধারণা বিশেষত কারণ এটি অন্তর্নিহিত রূপান্তরগুলিকে অনুমতি দেয়। আপনি অতিরিক্ত ডেটা এমপ্ল্যাপুলেট করতে পারেন:

class Money {
  Decimal amount;
  Currency currency;
};

Money m(Decimal("10.00"), Currency.USD);
CallSomeFunction(m);

এটি সম্পাদন করার জন্য কোড না লিখলে অন্য কোনও কিছুই সেই ফাংশনে ফিট করে না। দুর্ঘটনাজনিত রূপান্তর অসম্ভব। আমরা বেশি ঝামেলা ছাড়াই প্রয়োজন মতো আরও জটিল প্রকারগুলিও লিখতে পারি।


1
এমনকি আপনার জন্য এই শ্রেণি তৈরির সমস্ত কিছু করতে আপনি কিছু ভয়ঙ্কর ম্যাক্রোও লিখতে পারেন। (এসো, স্কিজ। আপনি জানেন যে আপনি চান))

1
এর মধ্যে কয়েকটি জন্য, একটি টাইপ-নিরাপদ ইউনিট লাইব্রেরি প্রতিটি জন্য একটি কাস্টম ক্লাস লেখার চেয়ে সহায়ক হতে পারে ( tuoml.sourceforge.net/html/scalar/scalar.html )।
স্টিভ জেসোপ

@ ক্রিস - অবশ্যই ম্যাক্রো নয়, সম্ভবত একটি টেম্পলেট শ্রেণি রয়েছে। স্টিভ যেমন উল্লেখ করেছেন, সেই ক্লাসগুলি ইতিমধ্যে লিখিত আছে।
কেভিন ক্লাইন

4
@ ক্রিস: ম্যাক্রোকে BOOST_STRONG_TYPEDEFআসলে বলা হয় ;)
ম্যাথিউ এম।

3

এ জাতীয় প্রকারের জন্য টাইপডেফগুলি ব্যবহার করা আরও দেখতে সি স্টাইল কোডের মতো।

সি ++ এ আপনি আকর্ষণীয় ত্রুটিগুলি পেয়ে যাবেন যত তাড়াতাড়ি আপনি ওভারলোড ফাংশনগুলি, বলুন, EventLevelএবং করার চেষ্টা করার সাথে সাথেই পাবেন Hour। এটি অতিরিক্ত ধরণের নামগুলি বেশ অকেজো করে তোলে।


2

আমরা (আমাদের সংস্থায়) এটি সি ++ তে অনেক কিছু করি। এটি কোড বোঝার এবং বজায় রাখতে সহায়তা করে। দলগুলির মধ্যে লোককে সরানো বা রিফ্যাক্টরিং করার সময় যা ভাল। উদাহরণ:

typedef float Price;
typedef int64_t JavaTimestmap;

void f(JavaTimestamp begin, JavaTimestamp end, Price income);

আমরা বিশ্বাস করি যে উপস্থাপনের ধরণ থেকে ডায়মেনড নামটিতে টাইপিডেফ তৈরি করা একটি ভাল অনুশীলন। এই নতুন নামটি একটি সফ্টওয়্যারটিতে একটি সাধারণ ভূমিকা উপস্থাপন করে । একটি প্যারামিটারের নাম স্থানীয় ভূমিকা । মধ্যে ভালো লেগেছে User sender, User receiver। কিছু জায়গায় এটি অনর্থক যেমন হতে পারে void register(User user)তবে আমি এটিকে কোনও সমস্যা বলে মনে করি না।

পরে একজনের ধারণা থাকতে পারে যে floatবুকিংয়ের বিশেষ রাউন্ডিং বিধিগুলির কারণে দাম উপস্থাপনের জন্য সেরা নয়, সুতরাং একটি ডাউনলোড করে বা প্রয়োগ করে BCDFloat(বাইনারি কোডেড দশমিক) প্রকার এবং টাইপএফ পরিবর্তন করে। কোনো অনুসন্ধান নেই এবং থেকে কাজ প্রতিস্থাপন floatকরতে BCDFloatআসলে আপনার কোডে সম্ভবত আরো অনেক ভাসে আছে হৃদয়কে নির্মম করা হবে।

এটি কোনও রূপালী বুলেট নয় এবং এর নিজস্ব ক্যাভ্যাট রয়েছে, তবে আমরা মনে করি এটি ব্যবহার না করেই এটি আরও ভাল is


অথবা স্কিথের পোস্টে ম্যাথিউ এম হিসাবে পরামর্শ মতো কেউ যেতে পারে BOOST_STRONG_TYPEDEF(float, Price)তবে আমি গড়পড়তা প্রকল্পে আর যেতে পারব না। অথবা হতে পারে। আমি এটি ঘুমাতে হবে। :-)
নোটলিস্ট

1

typedefমূলত আপনাকে একটির জন্য একটি উপাধি দেওয়ার অনুমতি দেয় type
এটি আপনাকে বার বার দীর্ঘ টাইপ করা এড়িয়ে যাওয়ার type namesএবং আপনার typeআরও সহজেই পঠনযোগ্য করে তোলার নমনীয়তা দেয় যেখানে উপনামের নামটি এর উদ্দেশ্য বা উদ্দেশ্য নির্দেশ করে type

আপনি typedefযদি আপনার প্রকল্পের মাধ্যমে আরও পঠনযোগ্য নাম রাখতে চান তবে এটি পছন্দের বিষয় ।
সাধারণত, আমি typedefআদিম প্রকারগুলিতে ব্যবহার করা এড়িয়ে চলি , যদি না এগুলি টাইপ করার জন্য অস্বাভাবিকভাবে দীর্ঘ হয়। আমি আমার প্যারামিটারের নামগুলি আরও সূচক রাখি।


0

আমি এই জাতীয় কিছু না। তাদের সবার আকার একই আকারের রয়েছে তা নিশ্চিত করা- তবে আপনাকে কেবল তাদের অবিচ্ছেদ্য ধরণের হিসাবে উল্লেখ করতে হবে।


0

এই জাতীয় টাইপিড ব্যবহার করা ততক্ষণ ঠিক আছে যতক্ষণ না কেউ এগুলি ব্যবহার করে বাড়ে সেগুলি তাদের অন্তর্নিহিত প্রতিনিধিত্ব সম্পর্কে কিছু জানতে হবে না । উদাহরণস্বরূপ, আপনি যদি কোনও PacketLengthবস্তুটি পাস করতে চান তবেprintf বা scanf, আপনাকে তার প্রকৃত প্রকারটি জানতে হবে যাতে আপনি সঠিক রূপান্তরকারী নির্দিষ্টকরণ চয়ন করতে পারেন। এরকম ক্ষেত্রে, টাইপিডেফ কিছু বিনিময়ে কিছু না কিনে কেবল মাত্রাতিরিক্ত স্ত্রীর সংযোজন করে; আপনি পাশাপাশি অবজেক্টটি সংজ্ঞায়িতও করতে পারেন int32_t

আপনার যদি প্রতিটি প্রকারের জন্য নির্দিষ্ট শব্দার্থবিজ্ঞানের প্রয়োগ করতে হবে (যেমন অনুমোদনযোগ্য ব্যাপ্তি বা মান) তবে আপনি কেবল টাইপডেফ তৈরি না করে এই ধরণের কাজ করতে একটি বিমূর্ত ডেটা টাইপ এবং ফাংশন তৈরি করা ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.