একই সদস্যের সাথে দুটি স্ট্রাক্ট কিন্তু বিভিন্ন নামকরণ, এটি কি ভাল ধারণা?


49

আমি এমন একটি প্রোগ্রাম লিখছি যাতে পোলার এবং কার্টেসিয়ান উভয় স্থানাঙ্কের সাথে কাজ করা জড়িত।

প্রতিটি ধরণের পয়েন্টের জন্য দুটি পৃথক স্ট্রাক্ট তৈরি করা কি বোধগম্য নয়, একটিতে Xএবং Yসদস্য এবং একটিতে Rএবং Thetaসদস্য রয়েছে।

বা এটি কি খুব বেশি এবং সদস্যদের সাথে firstএবং কেবল একটি কাঠামো রাখাই ভাল second

আমি যা লিখছি তা সহজ এবং এটি খুব বেশি পরিবর্তিত হবে না। তবে আমি কৌতূহল করছি যে ডিজাইনের দৃষ্টিকোণ থেকে আরও ভাল।

আমি ভাবছি প্রথম বিকল্পটি আরও ভাল। এটি আরও পঠনযোগ্য বলে মনে হচ্ছে এবং আমি টাইপ চেকিংয়ের সুবিধা পাব।


11
আমি সর্বদা উদ্দেশ্য অনুযায়ী একটি নতুন স্ট্রাক্ট / শ্রেণি তৈরি করি। একটি 3 ডি ভেক্টর প্রয়োজন, তিনটি ফ্লোট সহ একটি স্ট্রাক্ট 3 ডি_ভেক্টর তৈরি করুন। একটি uvw প্রতিনিধিত্ব প্রয়োজন, তিনটি ফ্লোট সহ স্ট্রাকচার টেক্সচার_কর্ডস তৈরি করুন। 3 ডি পরিবেশে একটি অবস্থান প্রয়োজন, তিনটি ফ্লোট সহ স্ট্রাক্ট অবস্থান তৈরি করুন। আপনি পয়েন্ট পেতে। এটি একই জিনিসটি পুরোপুরি ব্যবহার করার চেয়ে অনেক বেশি ভাল পঠনযোগ্যতার জন্য মঞ্জুরি দেয়। আপনি যদি একই জিনিসটি একাধিকবার সংজ্ঞায়িত করে বিরক্ত হন তবে একটি বেস 3-ফ্ল্যাট-কাঠামো ব্যবহার করুন এবং একই কাঠামোতে একাধিক নাম সংজ্ঞায়িত করুন।
কেভিন

তাদের যদি কিছু সাধারণ পদ্ধতি থাকে তবে সম্ভবত একটি। আপনি কি কখনও দুজনের সমতার তুলনা করতে চান?
পাপারাজ্জো

8
@ সিডনি যদি না আপনার কার্যকারিতাটির পুরোপুরি প্রয়োজন হয় তবে আমি চাই না। দুটি উপস্থাপনার মধ্যে রূপান্তর করতে আপনাকে একটি সিন / আর্কসিন অপারেশন করতে হবে। আপনি যতবার রূপান্তর করবেন প্রতিবার এটি সর্বনিম্ন উল্লেখযোগ্য বিটগুলিতে কিছুটা বিট্রোট প্রবর্তন করতে চলেছে। আমি প্রায় নিশ্চিত যে আপনি কোনও ক্লাসের সাথে ডিল করার চেষ্টা করে যা করেছি যা ঘটনার সাময়িকী এবং ইভেন্টগুলির মধ্যে সময় (x এবং 1 / x) উভয়েরই উপস্থাপনের মধ্য দিয়ে যা করেছি তার সাথে একইরকম বেদনাও শেষ করেছি। শ্রেণিতে কোন প্রতিনিধিত্বকে ট্র্যাকিং ট্র্যাকিং এবং সমস্ত গোলাকার মাথা ব্যথার সাথে মোকাবিলা করা এমন কিছু নয় যা আমি আবার করতে চাই।
ড্যান নীলি

3
ডেটাটাইপের একটি ভাল উদাহরণ যা প্রচুর জিনিসের প্রতিনিধিত্ব করতে পারে তা হল স্ট্রিং, তবে "স্ট্রিং টাইপড" একটি এন্টিপ্যাটার্ন। আপনার উদাহরণ লিখেছিলেন। উভয় সমন্বয় ব্যবস্থা সমর্থন করে এমন ধরণের জন্য ডট পণ্য বাস্তবায়নের চেষ্টা করুন।
নাথান কুপার

1
প্রকারের সুরক্ষার সুবিধার্থে যখনই প্রযোজ্য হয় তখন বিভিন্ন ধরণের ব্যবহার করার চেষ্টা করা উচিত - এটি আপনাকে কোনও ক্রিয়াকলাপে / থেকে ভুল টাইপ পাঠানো থেকে বিরত রাখবে (আপনার প্রোগ্রামিং ভাষার উপর নির্ভর করে সংকলনের সময় নির্ভুলতা পরীক্ষা করা) checking এটি রক্ষণাবেক্ষণকে সহজ করবে কারণ আপনি কোনও ধরণের সমস্ত সত্য ব্যবহার খুঁজে পেতে পারেন (ধরণের কারণে বিভ্রান্তিমূলক ব্যবহার না করে)।
এরিক tদ

উত্তর:


17

আমি উভয় সমাধান দেখেছি, সুতরাং এটি অবশ্যই প্রাসঙ্গিক নির্ভর।

পঠনযোগ্যতার জন্য, আপনার পরামর্শ অনুসারে একাধিক স্ট্রাইক থাকা খুব কার্যকর। যাইহোক, কিছু পরিবেশে, আপনি এই স্ট্রাক্টগুলিতে সাধারণ ম্যানিপুলেশন করতে চান এবং ম্যাট্রিক্স * ভেক্টর অপারেশনগুলির মতো আপনি নিজেকে নকল কোড খুঁজে পান। এটি যখন হতাশ হয়ে উঠতে পারে যখন নির্দিষ্ট অপারেশনটি আপনার ভেক্টরের স্বাদে না পাওয়া যায় কারণ সেখানে কেউ এটি বন্দরে রাখে না।

চূড়ান্ত সমাধানটি (যা আমরা শেষ পর্যন্ত দিয়েছি) হ'ল একটি সিআরটিপি টেম্পলেটেড বেস ক্লাস ফাংশনযুক্ত <0> () <1> () পান এবং <2> () জেনেরিক পদ্ধতিতে পান get এই ফাংশনগুলি তখন কার্টেসিয়ান বা পোলার স্ট্রাক্টে সংজ্ঞায়িত করা হয় যা এই বেস বর্গ থেকে প্রাপ্ত। এটি সমস্ত সমস্যার সমাধান করে, তবে পরিবর্তে নির্বিকার মূল্যে আসে: টেমপ্লেট রূপক শিখতে। তবে, যদি টেমপ্লেট মেটাপোগ্র্যামিং ইতিমধ্যে আপনার প্রকল্পের জন্য নিখুঁত খেলা হয় তবে এটি একটি ভাল মিল হতে পারে।


1
আপনার উত্তর খুব আকর্ষণীয়। একটি উদাহরণ প্রদান করা সম্ভব?
মহা সর্বশক্তিমান উট

1
আমি যা করেছি তার একটি উদাহরণ আমি প্রমাণ করতে পারি: এফআইআর ফিল্টারিং পোলার, কার্টেসিয়ান এবং এর ভেক্টরগুলি। গণিতটি বেশ অনুরূপ ছিল, অ্যাঙ্গেল (আন) কে মোড়ানো, কোডটির কিছু অংশ পারফরম্যান্সের কারণে ডুপ্লিকেট করা হয়েছিল এবং আমরা টেমপ্লেটগুলি যেখানে এটির জন্য ব্যবহার করেছি। সমস্ত স্টাফের জন্য আলাদা আলাদা নাম ব্যবহার করা হয়েছে। কর্টের "চরম সমাধান" কয়েকটি অনুলিপি সংরক্ষণ করতে পারত, তবে প্রায় সবগুলিই না।
ইউজিন রায়বতসেভ

1
আমার প্রথম প্রতিক্রিয়াটি ছিল যে কাস্টিং দ্বারা এই জাতীয় পরিস্থিতি আরও ভাল সমাধান করা যেতে পারে তবে এটি কিছুটা ঝুঁকিপূর্ণ হয়ে দাঁড়িয়েছে ।
200_সুকেস

114

হ্যাঁ, এটি অনেক অর্থবোধ করে।

কাঠামোর মান কেবল এটি কোনও কার্যকর নামের অধীনে ডেটা encapsulates নয়। মানটি হ'ল এটি আপনার উদ্দেশ্যগুলিকে কোডিফাই করে যাতে কম্পাইলার আপনাকে যাচাই করতে সহায়তা করতে পারে যে আপনি কোনও দিন তাদের লঙ্ঘন করছেন না (উদাহরণস্বরূপ কার্টেসিয়ান স্থানাঙ্ক সেটটির জন্য একটি পোলার স্থানাঙ্ক সেটটি ভুল করুন)।

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


6
+1 কম্পিউটারগুলি কম্পিউটারে যা করা ভাল তা করার জন্য কম্পিউটারটি ব্যবহার করার এবং আপনার মস্তিস্ককে আপনার নিজের কাজের উপর দৃষ্টি নিবদ্ধ দেওয়ার এক নিখুঁত বিবরণ।
ব্রায়ানএইচ

8
"প্রোগ্রামগুলি লোকদের পড়ার জন্য, এবং ঘটনাক্রমে কেবল মেশিনগুলি চালিত করার জন্য লেখা উচিত" " - আবেলসন এবং সুসমানের "কম্পিউটার প্রোগ্রামগুলির কাঠামো এবং ব্যাখ্যা" থেকে।
hlovdal

18

হ্যাঁ, কার্টেসিয়ান এবং পোলার উভয়ই (তাদের জায়গায়) বিশিষ্ট বুদ্ধিমান সমন্বিত প্রতিনিধিত্বমূলক স্কিমগুলি থাকা সত্ত্বেও সেগুলিকে আদর্শভাবে কখনও মিশ্রিত করা উচিত নয় (যদি আপনার কার্টেসিয়ান {1,1 a পয়েন্ট থাকে তবে এটি পোলার {1,1 এর থেকে খুব আলাদা পয়েন্ট) })।

আপনার প্রয়োজনের উপর নির্ভর করে, একটি ইন্টারফেস স্থানাঙ্ক, মত পদ্ধতি বাস্তবায়নের মূল্য হতে পারে X(), Y(), Displacement()এবং Angle()(অথবা সম্ভবত Radius()এবং Theta(), উপর নির্ভর করে)।


এটি আরও বেশি গুরুত্বপূর্ণ যদি ওপি সেই স্ট্রাস্টগুলির বাইরে ক্লাস তৈরি করে, কার্টেসিয়ান এবং মেরু স্থানাঙ্কের ক্রিয়াকলাপ আলাদা are
মাইন্ডউইন

1
শেষ অনুচ্ছেদের জন্য +1, এটিই আদর্শ সমাধান। একটি বিন্দু স্থান হল একটি বস্তু; এই পয়েন্টের অভ্যন্তরীণ উপস্থাপনের বিষয়টি বিবেচনা করা উচিত নয়। অবশ্যই, রিয়েল-ওয়ার্ল্ড উদ্বেগগুলি (পারফরম্যান্স, গোলাকৃতি ত্রুটি) এটিকে গুরুত্বপূর্ণ হতে পারে। এটি সমস্ত কিসের জন্য ব্যবহৃত হচ্ছে তার উপর নির্ভর করে।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

এবং এছাড়াও, উদাহরণস্বরূপ, এটি পরিবর্তিত হওয়ার সম্ভাবনা নেই, তবে তারা যদি অন্য 2 টি শ্রেণী হয় তবে কিছুই আপনাকে বলবে না যে তারা কিছু পয়েন্টে ডাইভারেজ হতে পারে।
ডাইজেডয়েস

8

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

আপনি যদি নামযুক্ত সদস্যদের সাথে কেবল একটি কাঠামো তৈরি করেন firstএবং secondনামগুলি বোঝায় না; আপনি অবশ্যই এগুলিকে মেমরি ঠিকানা হিসাবে বিবেচনা করবেন। এটি উচ্চ-স্তরের প্রোগ্রামিং ভাষার উদ্দেশ্যকে পরাস্ত করে।

তদতিরিক্ত, কেবলমাত্র এগুলি সমস্ত হিসাবে উপস্থাপনযোগ্য হিসাবে ঘটেছিল এর doubleঅর্থ এই নয় যে আপনি এগুলি বিনিময়যোগ্যভাবে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, θ একটি মাত্রাবিহীন কোণ, যেখানে y এর দৈর্ঘ্য ইউনিট রয়েছে। যেহেতু প্রকারগুলি যৌক্তিকভাবে পরিবর্তনযোগ্য নয়, সেগুলি দুটি অসম্পূর্ণ স্ট্রাইক হওয়া উচিত।

আপনার যদি সত্যিই মেমোরি-পুনঃব্যবহারের কৌশলগুলি খেলতে হয় - এবং আপনার প্রায় অবশ্যই হওয়া উচিত নয় - আপনি unionনিজের উদ্দেশ্যটি পরিষ্কার করতে আপনি সি তে একটি প্রকার ব্যবহার করতে পারেন ।


সেরা উত্তর, আইএমএইচও
ডিন র‌্যাডক্লিফ

2

প্রথমত, @ কিলিয়ান-ফথের পুরোপুরি উত্তরের উত্তর অনুসারে উভয়কেই স্পষ্টভাবে বলুন।

তবে আমি যুক্ত করতে চাই:

জিজ্ঞাসা করুন: জোড় হিসাবে বিবেচিত হওয়ার পরে আপনার কি সত্যিই এমন অপারেশন রয়েছে যা উভয়ের পক্ষে জেনেরিক double? এটি বলার মতো নয় যে আপনার অপারেশন রয়েছে যা তাদের উভয় শর্তে প্রযোজ্য Note উদাহরণস্বরূপ 'প্লট (কর্ড)' Coordপোলার বা কার্টেসিয়ান কিনা তা যত্নশীল করে । অন্যদিকে, ফাইল করার জন্য অবিরাম থাকা কেবল ডেটা যেমন হয় তেমন আচরণ করে। যদি আপনার সত্যিই জেনেরিক অপারেশন হয়, তবে হয় বেস ক্লাসটি সংজ্ঞায়িত করুন, বা একটিতে রূপান্তরকারী std::pair<double, double>বা tupleআপনার ভাষায় যা আছে তা বিবেচনা করুন।

তদতিরিক্ত, একটি পদ্ধতির হতে পারে একটি স্থানাঙ্কিত ধরণেরটিকে আরও মৌলিক হিসাবে বিবেচনা করা এবং অন্যটি কেবল ব্যবহারকারী বা বাহ্যিক মিথস্ক্রিয়াকে সমর্থন হিসাবে।

সুতরাং আপনি নিশ্চিত করতে পারেন যে সমস্ত মৌলিক ক্রিয়াকলাপগুলি কোড করা হয়েছে Cartesianএবং তারপরে রূপান্তর Polarকরার জন্য সহায়তা সরবরাহ করবে Cartesian। এটি অনেকগুলি ক্রিয়াকলাপের বিভিন্ন সংস্করণ প্রয়োগ করে এড়িয়ে চলে।


1

একটি সম্ভাব্য সমাধান, ভাষার উপর নির্ভর করে এবং যদি আপনি জানেন যে উভয় শ্রেণীরই একই পদ্ধতি এবং ক্রিয়াকলাপ থাকবে, তবে ক্লাসটি একবারে সংজ্ঞায়িত করা হবে এবং প্রকারের আলাদাভাবে নামকরণের জন্য টাইপ এলিয়াস ব্যবহার করা হবে।

এর সুবিধাটিও রয়েছে যে যতক্ষণ ক্লাসগুলি হুবহু একই রকম হয়, আপনি কেবলমাত্র একটি বজায় রাখতে পারেন, তবে যত তাড়াতাড়ি আপনার এগুলি পরিবর্তন করার প্রয়োজন হয়, প্রকারগুলি ইতিমধ্যে ব্যবহৃত হয়ে যাওয়ার কারণে আপনার কোডটি ব্যবহার করে পরিবর্তন করার দরকার নেই distincly।

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


উভয় শ্রেণির সদস্যের নাম এক নয়। প্রকৃতপক্ষে নামগুলি কেবলমাত্র দুটি শ্রেণীর মধ্যে পার্থক্য
মহা সর্বশক্তিমান উট

@ এমএইচডি.তাহাবি আপনি যথাযথ নাম দিয়ে গেটার এবং সেটটারগুলি প্রয়োগ করতে পারেন, আপনি যে ক্লাসটি ব্যবহার করছেন তা একই, তবে আপনি যে ক্রিয়াকলাপটি ব্যবহার করতে চান তার জন্য উপযুক্ত নাম সরবরাহ করতে পারে। এটি কিছুটা ভার্বোজ হয়ে যায় তবে আপনাকে কম কোডটির নকল করতে হবে।
সোভালোরজেন

0

আমি বিশ্বাস করি যে একই সদস্যের নাম থাকা এই ক্ষেত্রে একটি খারাপ ধারণা, কারণ এটি কোডটিকে আরও ত্রুটিযুক্ত করে তোলে।

দৃশ্যের কল্পনা করুন: আপনার কয়েকটি কার্টেসিয়ান পয়েন্ট রয়েছে: পিএনটিএ এবং পিএনটিবি। তারপরে আপনি স্থির করেন যে কোনও কারণে, তাদের আরও ভালভাবে মেরু স্থানাঙ্কে উপস্থাপন করা উচিত, এবং ঘোষণা এবং নির্মাতা পরিবর্তন করা উচিত।

এখন, যদি আপনার সমস্ত অপারেশনগুলি কেবল মেথড কল হত তবে:

double distance = pntA.distanceFrom(pntB);

তাহলে আপনি ভাল আছেন। তবে আপনি যদি সদস্যদের স্পষ্টভাবে ব্যবহার করেন? তুলনা করা

double leftMargin = abs(pntA.x - pntB.x);
double leftMargin = abs(pntA.first - pntB.first);

প্রথম ক্ষেত্রে, কোডটি সংকলন করবে না। আপনি তত্ক্ষণাত্ ত্রুটিটি দেখতে পাবেন এবং এটি ঠিক করতে সক্ষম হবেন। তবে আপনার যদি একই সদস্যের নাম থাকে তবে ত্রুটিটি কেবলমাত্র যৌক্তিক স্তরে থাকবে, এটি সনাক্ত করা আরও শক্ত।

আপনি যদি কোনও অ-অবজেক্ট-ভিত্তিক ভাষায় লিখেন তবে ফাংশনে ভুল কাঠামোকে দেওয়া আরও সহজ। আপনাকে নিম্নলিখিত কোডটি লিখতে বাধা দেওয়ার কী আছে?

double distance = calculate_distance_polar(cartesianPointA, polarPointB);

অন্যদিকে বিভিন্ন উপাত্তের ধরণ আপনাকে সংকলনের সময় ত্রুটিটি সন্ধান করতে দেয়।

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