কোড ডুপ্লিকেশন কি সি প্রয়োজনীয় প্রয়োজনীয়?


16

আমি সি এর পরিবর্তে নতুন, এবং আমি যদি ভাবছি যে সাধারণ তথ্য কাঠামো এবং সি সাধারণভাবে লেখার ক্ষেত্রে কোড ডুপ্লিকেশন কোনও প্রয়োজনীয় অশুভ?

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

জেনেরিক প্রয়োগগুলি কি আদর্শ হয়, বা আপনি প্রতিটি ব্যবহারের ক্ষেত্রে পৃথক বাস্তবায়ন লেখেন?


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


1
@ কেভিঙ্কলাইন: আচ্ছা, জাভাতে জেনারিকস রয়েছে। মঞ্জুর, এটি জেনেরিকের ধরণের "পর্দার পিছনের লোকটির দিকে মনোযোগ দেবেন না"।
রবার্ট হার্ভে

1
এবং জেনেরিকের আগে, আপনি অবজেক্টে পাস করতে এবং যথাক্রমে ফ্লোট, ডাবল, পূর্ণসংখ্যার এবং লংতে উত্তীর্ণ হতে পারতেন।
ড্যানিয়েল ক্যাপলান

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

উত্তর:


27

সি জেনেরিক কোড লিখতে অসুবিধা সৃষ্টি করে। সি ++ এর বিপরীতে, যা আপনাকে টেম্পলেট এবং ভার্চুয়াল ফাংশন দেয়, সিটিতে জেনেরিক কোড লেখার জন্য কেবল 3 টি পদ্ধতি রয়েছে:

  1. void* পয়েন্টার
  2. প্রিপ্রোসেসর ম্যাক্রোস
  3. ফাংশন পয়েন্টার

void* পয়েন্টারগুলি আদর্শ থেকে অনেক দূরে, যেহেতু আপনি কম্পাইলার দ্বারা প্রদত্ত সমস্ত ধরণের সুরক্ষা হারিয়ে ফেলেন, যার ফলে অবৈধ ধরণের কাস্টের ফলে কঠোরভাবে ডিবাগ অপরিজ্ঞাত আচরণ হতে পারে।

প্রিপ্রোসেসর ম্যাক্রোগুলির সুস্পষ্ট ত্রুটি রয়েছে - প্রিপ্রোসেসর সম্প্রসারণ মূলত কেবল একটি সন্ধান / প্রতিস্থাপন প্রক্রিয়া যা সংকলন পর্বের আগে ঘটেছিল, যার ফলে আবার হার্ড-টু-ডিবাগ ত্রুটি হতে পারে। প্রত্নতাত্ত্বিক উদাহরণটি হ'ল:, আপনি কল করলে #define add(x) (x+x)যেখানে xদুবার বাড়ানো যায় add(i++)। আপনি করতে পারেন সম্পূর্ণরূপে সি-ম্যাক্রো ব্যবহার টেমপ্লেট ধাঁচের জেনেরিক কোড লিখতে, কিন্তু ফল সত্যিই অসহ্য এবং বজায় রাখা কঠিন

ফাংশন পয়েন্টারগুলি জেনেরিক কোড লেখার জন্য একটি ভাল উপায় সরবরাহ করে তবে দুর্ভাগ্যক্রমে তারা আপনাকে টাইপ সাধারণতা দেয় না - তারা কেবল রান-টাইম পলিমারফিজমের সম্ভাবনা সরবরাহ করে (যার কারণে, উদাহরণস্বরূপ, স্ট্যান্ডার্ড লাইব্রেরি qsortএখনও একটি ফাংশন প্রয়োজন যা গ্রহণ করে void*পয়েন্টার।)

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

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


1
কেউ বাহ্যিক টেম্প্লেটিং ভাষা / সরঞ্জাম বা শেল স্ক্রিপ্ট ব্যবহার করে বা পিপীলিকা ব্যবহার করে পুনরাবৃত্তিযোগ্য সি কোডও তৈরি করতে পারে ...
চাকরি

এই গুগল-আপ্লুত রাশিয়ান ইউআরএল যা আপনি আপনার উত্তরে রেখেছেন? এটিতে ক্লিক করা আমার ব্রাউজারে একটি "ওপেন" প্রম্পট প্রদর্শিত হবে। এটি কি নিরাপদ?
রবার্ট হার্ভে

2
@ রবার্টহারভে আমার অ্যান্টিভাইরাস এবং সুরক্ষা স্ক্যানগুলি মনে করে এটি ঠিক আছে। এটি একটি সি ল্যাঙ্গুয়েজ শিরোলেখ ফাইল, এক্সটেনশন। এইচ। এটি বৈধ প্রদর্শিত হয়।
maple_shaft

@ ম্যাপেল_শ্যাফ্ট: ঠিক আছে। আমি লিঙ্কটি ঘিরে গুগলাইজেশন সরিয়েছি।
রবার্ট হার্ভে

এটি কেবল একটি সরল-পাঠ্য .h (সি-শিরোনাম) ফাইল
চার্লস সালভিয়া

15

আমি অন্যের পক্ষে কথা বলতে পারি না, তবে সি এর সাথে আমার নিজের ব্যক্তিগত অভিজ্ঞতায় কোডের সদৃশতা খুব একটা সমস্যা হয়ে ওঠেনি। এটি প্রকল্পের আকারগুলির কারণে, না কোনও মনোনিবেশিত নমুনা সেট কিনা তা আমি বলতে পারি না। যাইহোক, আমি তিনটি নিয়ম অনুসরণ করি যা আমি অনুসরণ করি যা আমি মনে করি এটি প্রযোজ্য। কোনও নির্দিষ্ট ক্রমে নয়, তারা ...

  1. যা প্রয়োজন তা লিখুন। যদি প্রয়োজন হয় তবে সাধারণতা পরে আসতে পারে।
  2. সাধারণতার প্রয়োজন হলে অকার্যকর পয়েন্টার, ফাংশন পয়েন্টার এবং কাঠামোর আকার অমূল্য হতে পারে। রুটিন qsort () উদাহরণস্বরূপ, তিনটি ব্যবহার করে।
  3. আপনার কোড পরিষ্কার করার জন্য ওজন দিন।

5

এটি লক্ষণীয় যে কোড ডুপ্লিকেশন হ্রাস করার জন্য আপনার সম্পূর্ণ জেনেরিক সমাধানের প্রয়োজন হতে পারে না worth কখনও কখনও সাধারণ রিফ্যাক্টরিং এবং কিছুটা পদ্ধতি সাধারণীকরণ যথেষ্ট।

বিস্তৃত দর্শকদের জন্য একটি সাধারণ সমাধান লেখার সময় আপনাকে বিবেচনা করতে হবে:

  1. ভোক্তারা আপনার কোডটি কোন উপন্যাসের উপায়ে ব্যবহার করতে পারে এবং আপনি সেগুলি কীভাবে সংযুক্ত করবেন?
  2. আমার কোন ত্রুটিগুলি ধরতে হবে? আমার কোন ত্রুটি ধরা উচিত নয় ?
  3. API এর কতটা শক্তিশালী হওয়া দরকার? আমার কতগুলি ওভারলোড সরবরাহ করতে হবে?
  4. কোডটি খারাপ উদ্দেশ্যে ব্যবহার করতে না পারে সেজন্য আমাকে কোন সুরক্ষা ব্যবস্থা নিতে হবে?

এনট ফ্রেপার কোডটিতে একক নকশার সিদ্ধান্ত সম্পর্কে একটি সম্পূর্ণ নিবন্ধ লিখেছিলেন এরিক লিপার্ট । সব মিলিয়ে প্রায়শই কেবল রিফ্যাক্টর সহজ।


3

আমি সাধারণত গ্লিবের মতো জেনেরিক বাস্তবায়ন ব্যবহার করি , তবে কাস্টিংটি যদি খুব বিরক্তিকর হয় তবে এর জন্য একটি ছোট টাইপ-নির্দিষ্ট মোড়ক তৈরি করুন। তবে void*জেনেরিক টাইপের হিসাবে যেমন ব্যবহার করা হয় তেমন সিতেও প্রচুর ingালাই প্রত্যাশা করা হয়, সুতরাং অন্য ভাষায় যা "অগোছালো" হিসাবে বিবেচিত হবে তা কেবলমাত্র সাধারণ সি। পর্যাপ্ত পরিমাণে, এটি অনেক বেশি প্রাকৃতিক দেখাবে যখন আপনি ভাষা আরও অভিজ্ঞতা পেতে।


2
"অন্য ভাষায় যাকে 'অগোছালো' বলে বিবেচনা করা হবে এটি কেবলমাত্র সাধারণ সি। পর্যাপ্ত পরিমাণে, আপনি যখন ভাষাটিতে আরও অভিজ্ঞতা অর্জন করবেন তখন এটি অনেক বেশি প্রাকৃতিক দেখাবে।" হা, হা, হা! সি সর্বদা আমার প্রিয় ভাষাগুলির একটি, তবে এটি এখনও বেশ মজার!
গ্লেনপিটারসন

0

আপনার পুনঃব্যবহারযোগ্যতার বিষয়টি সি এর জন্য অনন্য নয় তবে, কিছু দুর্দান্ত এবং খুব পুনরায় ব্যবহারযোগ্য হ্যাশম্যাপ বাস্তবায়ন রয়েছে যা আপনার নিজের ভিত্তিতে তৈরি করতে পারে। দু'এক দশক ধরে যা চলছে তার একটি জাভাতে রয়েছে: http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

পুনরুক্তিকারীর ধারণা থেকে মুক্তি পেতে জাভা 8 এর জন্য হ্যাশম্যাপ সহ সমস্ত জাভা সংগ্রহগুলি পুনরায় লেখা হচ্ছে এবং পরিবর্তে আপনাকে অভ্যন্তরীণভাবে পুনরাবৃত্তি করতে পারে যাতে আপনার সংগ্রহটিতে কোনও ফাংশন পাস করার প্রয়োজন হয়। সমবর্তী কোড লেখার জন্য এটি একটি বড় জয় - সংগ্রহটি অভ্যন্তরীণভাবে সম্মতিগুলি পরিচালনা করতে পারে যাতে ক্লায়েন্টের প্রয়োজন হয় না। এটি বলেছিল যে বেশিরভাগ প্রোগ্রামাররা ফাংশন পয়েন্টারগুলি পাস করতে অভ্যস্ত হয় না। এটি হ্যাশম্যাপের নেতৃত্বাধীন কোথায় রয়েছে তা ব্যাখ্যা করার জন্য এটি একটি ভাল কাজ করে: http://cr.openjdk.java.net/~briangoetz/lambda/collections-overview.html

স্কেলার বাক্য গঠনটি সিটির মতো এরকম কিছু অনুবাদ করতে শক্ত হতে পারে তবে জাভা 8 সংগ্রহগুলি ইতিমধ্যে যেভাবে কাজ করে তার একটি উদাহরণ এখানে রয়েছে - ডিফল্টরূপে স্থায়ীভাবে পরিবর্তনযোগ্য, বিভিন্ন ট্রান্সফর্মেশন পদ্ধতি সরবরাহ করে, ফাংশন পয়েন্টার এবং অন্যান্য ব্যবহার করে আংশিক প্রয়োগের মতো দুর্দান্ত জিনিসগুলি: http://www.scala-lang.org/api/current/index.html#scala.collection.Map

আপনি যদি হ্যাশম্যাপস এবং আরও আরও উন্নত ডেটা স্ট্রাকচারের সাহায্যে প্রচুর পরিমাণে কাজ করে থাকেন তবে আপনি এমন কোনও ভাষা সন্ধান করতে চাইতে পারেন যা তাদের সমর্থন করে।

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

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


1
- "আমি মনে করি না যে এটি অতি-সরলকরণের কথা বলা খুব বেশি যে আপনি যখন নিজেকে নকল কোডটি খুঁজে পেয়েছেন তখন আপনার একটি ফাংশন করা উচিত" - সি তে এটি একটি ওভার সরলীকরণ। প্রতিটি ডাটা টাইপের জন্য পুশ এবং পপ ফাংশনগুলিকে সদৃশ না করে পূর্ণসংখ্যা, ডাবল এবং স্ট্রিংয়ের জন্য সি-তে স্ট্যাক তৈরি করার চেষ্টা করুন।
মাইকে 30

@ মিম্ক কি অকার্যকর পয়েন্টার ব্যবহার করে সম্ভব নয়?
সাকিস্ক

@ মাইক - ভাল পয়েন্ট তবে একটি পাল্টা পয়েন্টটি হ'ল আপনি প্রতিটি ডেটা টাইপের জন্য স্ট্যাকটি এমনভাবে প্রয়োগ করতে পারেন যাতে আপনাকে আবার স্ট্যাক প্রয়োগের প্রয়োজন হয় না। সুতরাং লক্ষ্যটি সংখ্যাফল্য = 1 নয়, আরও 5 টির মতো You আপনি সম্ভবত এর intজন্য বাস্তবায়ন কাজটি করতে সক্ষম হবেন char... আমি সি ব্যবহার করেছি এতদিন হয়েছে যে আমি মনে করতে পারি না।
GlenPeterson

1
@faif। হ্যাঁ, তবে অকার্যকর পয়েন্টারগুলি ব্যবহার করার প্রয়োজন সিটির জন্য বিন্দুটিকে তৈরি করে Castালাই পয়েন্টারগুলি সি ++ এ পাওয়া বিকল্পগুলির তুলনায় ধীর এবং কম মার্জিত। কোডটি নকল করে সি
তে

@ মাইক 30 এর সম্পর্কে কোনও প্রমাণ / রেফারেন্স রয়েছে: "সিতে পয়েন্টারগুলি সি ++ এ পাওয়া বিকল্পগুলির চেয়ে ধীর?"
সাকিস্ক

0

আমি ভাবছি যে সাধারণ ডেটা স্ট্রাকচার এবং সাধারণভাবে সি লেখার ক্ষেত্রে কোড ডুপ্লিকেশন কোনও প্রয়োজনীয় অশুভ কিনা?

সিতে, একেবারে আমার জন্য, যে কেউ সি এবং সি ++ এর মধ্যে বাউন্স করে। আমি অবশ্যই সি ++ এর চেয়ে সিটিতে প্রতিদিনের ভিত্তিতে আরও তুচ্ছ জিনিসগুলি নকল করি তবে ইচ্ছাকৃতভাবে, এবং আমি অবশ্যই এটি "দুষ্ট" হিসাবে দেখি না কারণ কমপক্ষে কিছু ব্যবহারিক সুবিধা রয়েছে - আমি মনে করি সমস্ত বিষয় বিবেচনা করার জন্য এটি একটি ভুল কঠোরভাবে "ভাল" বা "মন্দ" - প্রায় সব কিছুই বাণিজ্য-অফের বিষয়। এই বাণিজ্য-বাণিজ্যগুলি স্পষ্টভাবে বোঝা হ'ল অনিশ্চয়তায় আফসোসযোগ্য সিদ্ধান্তগুলি এড়াতে না পারা এবং কেবল "ভাল" বা "মন্দ" হিসাবে জিনিসকে লেবেল করা সাধারণত এই জাতীয় সমস্ত সূক্ষ্মতা উপেক্ষা করে।

সমস্যাটি সি এর মতো স্বতন্ত্র নয় যদিও অন্যরা বলেছেন, এটি জেনেরিকের জন্য ম্যাক্রো বা শূন্য পয়েন্টারগুলির চেয়ে আরও মার্জিত কিছু না থাকার কারণে, অ-তুচ্ছ ওওপির বিশ্রীতা এবং এই সত্যটি হতে পারে যে সি স্ট্যান্ডার্ড লাইব্রেরি কোনও পাত্রে আসে না। সি ++ তে, কোনও ব্যক্তি নিজের লিঙ্কযুক্ত তালিকার প্রয়োগ করছেন এমন ব্যক্তিরা যাতে শিক্ষার্থী না হয় তবে তারা কেন স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করছেন না তা দাবি করে জনগণের একটি ক্ষুব্ধ জনতা আসতে পারে। সি-তে, আপনি একজন ক্রুদ্ধ জনতাকে আমন্ত্রণ জানিয়েছিলেন যদি আপনি নিজের ঘুমের মধ্যে আত্মবিশ্বাসের সাথে একটি মার্জিত লিঙ্কযুক্ত তালিকা বাস্তবায়ন করতে না পারেন যেহেতু একটি সি প্রোগ্রামার প্রায়শই অন্তত এই ধরণের জিনিসগুলি প্রতিদিন করতে সক্ষম হয় বলে আশা করা যায়। এটা ' সংযুক্ত তালিকার উপর কিছু অদ্ভুত আবেশের কারণে নয় যে লিনাস টরভাল্ডস ভাষা বোঝে এবং "ভাল স্বাদ" আছে এমন একজন প্রোগ্রামারকে মূল্যায়নের জন্য মানদণ্ড হিসাবে ডাবল ইন্ডিয়ারেশন ব্যবহার করে এসএলএল অনুসন্ধান এবং অপসারণের বাস্তবায়ন ব্যবহার করেছিলেন। এটি কারণ সি প্রোগ্রামারদের তাদের ক্যারিয়ারে কয়েক হাজার বার এই জাতীয় যুক্তি প্রয়োগ করার প্রয়োজন হতে পারে। সি এর ক্ষেত্রে এটি কোনও শেফের মতো একটি নতুন কুকের দক্ষতার মূল্যায়ন করার জন্য তাদের কেবলমাত্র কিছু ডিম প্রস্তুত করে তা দেখার জন্য যে তাদের কমপক্ষে যে সমস্ত মৌলিক জিনিসগুলির প্রয়োজন হয় যা তারা সর্বদা করণীয়।

উদাহরণস্বরূপ, আমি সম্ভবত এই বেসিক "ইনডেক্সড ফ্রি লিস্ট" ডেটা স্ট্রাকচার স্থানীয়ভাবে সিতে স্থানীয়ভাবে প্রতিটি সাইটের জন্য এই বরাদ্দ কৌশল ব্যবহার করে (প্রায় একবারে আমার সাথে যুক্ত সমস্ত কাঠামো একবারে একটি নোড বরাদ্দ এড়াতে এবং স্মৃতি অর্ধন করতে ব্যবহার করে) -৪-বিটের লিঙ্কগুলির ব্যয়):

এখানে চিত্র বর্ণনা লিখুন

তবে সি তে এটি কেবলমাত্র reallocএকটি বর্ধনযোগ্য অ্যারেতে কোডের খুব অল্প পরিমাণে নিয়ে যায় এবং কোনও নতুন ডেটা কাঠামো প্রয়োগ করে যখন এটি ব্যবহার করে কোনও ফ্রি তালিকায় একটি সূচিকৃত পদ্ধতির ব্যবহার করে কিছু মেমরি পুলে যায়।

এখন আমি একই জিনিসটি সি ++ এ প্রয়োগ করেছি এবং সেখানে আমি কেবল এটি শ্রেণিক টেম্পলেট হিসাবে একবার প্রয়োগ করেছি। তবে এটি অনেকগুলি, কোডের কয়েকশ লাইন এবং কিছু বাহ্যিক নির্ভরতা যা কয়েক শত কোডের লাইনের বিস্তৃতি সহ সি ++ সাইডে আরও জটিল বাস্তবায়ন। এবং এটি আরও জটিল হওয়ার মূল কারণ হ'ল কারণ আমি এটিকে কোড ধারণ Tকরতে পারি যে কোনও সম্ভাব্য ডেটা টাইপ হতে পারে। এটি যে কোনও সময় নিক্ষেপ করতে পারে (এটি ধ্বংস করার পরে, যা আমি স্ট্যান্ডার্ড লাইব্রেরি পাত্রে যেমন স্পষ্টভাবে করতে হয়), আমাকে স্মৃতি বরাদ্দ করার জন্য সঠিক প্রান্তিককরণ সম্পর্কে ভাবতে হয়েছিলT (যদিও ভাগ্যক্রমে এটি সি ++ 11 এর পরে আরও সহজ করা হয়েছে), এটি তুচ্ছ-বিচ্ছিন্নভাবে গঠনযোগ্য / ধ্বংসাত্মক হতে পারে (প্লেসমেন্টটি নতুন এবং ম্যানুয়াল ডেটর অনুরোধের প্রয়োজন), আমাকে এমন পদ্ধতি যুক্ত করতে হবে যাগুলির জন্য সমস্ত কিছু প্রয়োজন হবে না তবে কিছু জিনিসগুলির প্রয়োজন হবে, এবং আমাকে পুনরুক্তিযোগ্য উভয়কেই পরিবর্তনযোগ্য এবং কেবল পঠনযোগ্য (কনস্ট্যান্ট) পুনরাবৃত্তকারী এবং আরও অনেক কিছু যোগ করতে হবে।

বর্ধনযোগ্য অ্যারে রকেট বিজ্ঞান নয়

সি ++ তে লোকেরা এটিকে শব্দ করে তোলে std::vectorযেমন একটি রকেট বিজ্ঞানীর কাজ, মৃত্যুর জন্য অনুকূলিত করা, তবে এটি কোনও নির্দিষ্ট ডেটা টাইপের সাথে কোডড ডায়নামিক সি অ্যারের চেয়ে ভাল আর কোনও সম্পাদন করে না যা কেবল reallocধাক্কা দিয়ে পিঠে পিঠে অ্যারে ক্ষমতা বাড়ানোর জন্য ব্যবহার করে ডজন লাইন কোড। পার্থক্যটি হ'ল এটি কেবলমাত্র একটি বর্ধনযোগ্য র্যান্ডম-অ্যাক্সেস ক্রমটিকে মানের সাথে সম্পূর্ণরূপে মেনে চলার জন্য একটি জটিল জটিল বাস্তবায়ন গ্রহণ করে, অপরিবর্তিত উপাদানগুলির উপর ভিত্তি করে সিটগুলি এড়ানো, ব্যতিক্রম-নিরাপদ, উভয় কনস্ট এবং নন-কনস্ট্যান্ড এলোমেলো-অ্যাক্সেস পুনরাবৃত্তিকে সরবরাহ করে, টাইপ ব্যবহার করুন নির্দিষ্ট অবিচ্ছেদ্য প্রকারের জন্য পরিসীমা কেন্দ্রগুলি থেকে ফিল সিটারগুলি পূরণ করার বৈশিষ্ট্যগুলিT, সম্ভাব্যভাবে বিভিন্ন ধরণের বৈশিষ্ট্য ইত্যাদি ব্যবহার করে পিওডিদের বিভিন্নভাবে আচরণ করতে পারেন etc. ইত্যাদি সময়ে, আপনি অবশ্যই একটি বর্ধনশীল গতিশীল অ্যারে তৈরি করার জন্য একটি খুব জটিল বাস্তবায়ন প্রয়োজন, তবে কেবলমাত্র এটি সম্ভাব্য প্রতিটি ব্যবহারের ক্ষেত্রে কল্পনা করার জন্য হ্যান্ডেল করার চেষ্টা করছে only প্লাস দিক থেকে, আপনি যদি অতিরিক্তভাবে পিওডি এবং অ-তুচ্ছ ইউডিটি উভয়ই সংরক্ষণ করতে চান, জেনেরিক পুনরায়-ভিত্তিক অ্যালগরিদমের জন্য কোনও ব্যবহারযোগ্য ডেটা কাঠামোতে কাজ করে তবে আপনি সেই সমস্ত অতিরিক্ত প্রচেষ্টা থেকে পুরো মাইলেজ পেতে পারেন, ব্যতিক্রম হ্যান্ডলিং এবং আরআইআই থেকে উপকার পাবেন, কমপক্ষে কখনও কখনও std::allocatorআপনার নিজের কাস্টম বরাদ্দকারী ইত্যাদির সাথে ওভাররাইড করুন ইত্যাদি It এটি নিশ্চিতভাবে স্ট্যান্ডার্ড লাইব্রেরিতে প্রদান করবে যখন আপনি কতটা সুবিধা বিবেচনা করবেনstd::vector এটি সমগ্র বিশ্বের লোকদের জন্য রয়েছে যারা এটি ব্যবহার করেছেন, তবে এটি এমন কিছু স্ট্যান্ডার্ড লাইব্রেরিতে বাস্তবায়িত হয়েছে যাতে পুরো বিশ্বের প্রয়োজনগুলি লক্ষ্য করার জন্য ডিজাইন করা হয়েছিল।

সাধারণ প্রয়োগগুলি খুব নির্দিষ্ট ব্যবহারের কেসগুলি পরিচালনা করে

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

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

সি ++ তে আক্রমণ নয়!

তবে এটি সি ++ এর উপর আক্রমণ নয়, কারণ আমি সি ++ পছন্দ করি, তবে যখন তথ্য কাঠামোর কথা আসে তখন আমি সি ++ এর পক্ষে এসেছি মূলত সত্যিকারের অ-তুচ্ছ তথ্য কাঠামোর জন্য যা বাস্তবায়নের জন্য আমি অতিরিক্ত অতিরিক্ত সময় ব্যয় করতে চাই খুব সাধারণ উপায়, সম্ভাব্য সকল প্রকারের বিরুদ্ধে ব্যতিক্রম-নিরাপদ করুন T, মানসম্পন্ন-অনুগত এবং পুনরাবৃত্তিযোগ্য ইত্যাদি তৈরি করুন, যেখানে এই ধরণের আপফ্রন্ট ব্যয় সত্যিই এক টন মাইলেজের আকারে প্রদান করে।

তবুও এটি একটি খুব আলাদা ডিজাইনের মানসিকতার প্রচার করে। সি ++ এ আমি যদি সংঘর্ষ শনাক্তকরণের জন্য একটি অ্যাক্রি তৈরি করতে চাই তবে আমার এটিকে নবম ডিগ্রীতে সাধারণীকরণের প্রবণতা রয়েছে। আমি এটিকে কেবল সূচিযুক্ত ত্রিভুজ মেসগুলি সঞ্চয় করতে চাই না। আমার নখদর্পণে একটি সুপার পাওয়ারফুল কোড জেনারেশন ব্যবস্থা রয়েছে যা রানটাইমের সময় সমস্ত বিমূর্ত দণ্ডকে সরিয়ে দেয় যখন কেন এটি কেবলমাত্র একটি ডেটা টাইপের মধ্যে সীমাবদ্ধ রাখব? আমি এটি প্রক্রিয়াগত ক্ষেত্র, কিউবস, ভক্সেলস, এনআরবিস সারফেস, পয়েন্ট মেঘ ইত্যাদির ইত্যাদি সংরক্ষণ করতে চাই এবং এটিকে সবকিছুর জন্য ভাল করার চেষ্টা করি, কারণ আপনার নখদর্পে টেমপ্লেটগুলি রাখলে এটি সেভাবে ডিজাইন করতে প্রলুব্ধ করে। আমি এটিকে সংঘর্ষ সনাক্তকরণের মধ্যেও সীমাবদ্ধ রাখতে চাইব না - রাইট্র্যাকিং, পিকিং ইত্যাদি কীভাবে? সি ++ এটিকে প্রাথমিকভাবে "সাজানো সহজ" দেখায় নবম ডিগ্রীতে একটি ডেটা স্ট্রাকচারকে সাধারণীকরণ করতে। এবং এইভাবেই আমি সি ++ এ যেমন স্থানিক সূচকগুলি ডিজাইন করতাম। আমি তাদের সমগ্র বিশ্বের ক্ষুধার প্রয়োজনগুলি পরিচালনা করার জন্য তাদের ডিজাইনের চেষ্টা করেছি এবং এর বিনিময়ে আমি যা পেয়েছিলাম তা হ'ল অত্যন্ত জটিল কোড সহ এটি সমস্ত সম্ভাব্য ব্যবহারের ক্ষেত্রে কল্পনাযোগ্য against

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

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

জেনেরিক প্রয়োগগুলি কি আদর্শ হয়, বা আপনি প্রতিটি ব্যবহারের ক্ষেত্রে পৃথক বাস্তবায়ন লেখেন?

তুচ্ছ জিনিসের জন্য যেমন একা-সংযুক্ত 32-বিট ইনডেক্সড তালিকাগুলি একটি অ্যারের থেকে নোড ব্যবহার করে বা নিজেকে অ্যারেওলেক্ট করে এমন একটি অ্যারে ( std::vectorসি ++ এর সমতুল্য সমতুল্য ) বা, বলুন, একটি অষ্টিকর যা কেবলমাত্র পয়েন্টগুলি সঞ্চয় করে এবং আরও কিছু করার লক্ষ্য রাখে না, ' কোনও ডেটা টাইপ স্টোর করার বিন্দুতে সাধারণীকরণ করতে বিরক্ত করবেন না। আমি এগুলি একটি নির্দিষ্ট ডেটা ধরণের সঞ্চয় করতে প্রয়োগ করি (যদিও এটি বিমূর্ত হতে পারে এবং কিছু ক্ষেত্রে ফাংশন পয়েন্টার ব্যবহার করতে পারে তবে স্ট্যাটিক পলিমারফিজম সহ হাঁসের টাইপের চেয়ে কমপক্ষে আরও নির্দিষ্ট) specific

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

অযৌক্তিক জিনিসের জন্য, সাধারণত যখন আমি সি ++ তে পৌঁছাতাম তবে আমি যদি এটি সিতে প্রয়োগ করি তবে আমি কেবলমাত্র void*পয়েন্টার ব্যবহার করে বিবেচনা করব, সম্ভবত প্রতিটি উপাদানগুলির জন্য কতটা মেমরি বরাদ্দ করতে হবে এবং সম্ভবত copy/destroyফাংশন পয়েন্টারগুলি জানতে একটি টাইপ আকার গ্রহণ করব তাত্পর্যপূর্ণভাবে গঠনযোগ্য / ধ্বংসাত্মক না হলে ডেটা গভীর অনুলিপি এবং ধ্বংস করতে। বেশিরভাগ সময় আমি বিরক্ত করি না এবং খুব জটিল ডেটা কাঠামো এবং অ্যালগরিদম তৈরি করতে এত বেশি সি ব্যবহার করি না।

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

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

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

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

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

সমজাতীয় বিট এবং বাইটস

সিতে একটি জিনিস কাজে লাগানো যেহেতু এতে সুরক্ষার মতো অন্তর্নিহিত অভাব রয়েছে তা হ'ল বিট এবং বাইটের বৈশিষ্ট্যের উপর ভিত্তি করে জিনিসকে একজাতীয়ভাবে সঞ্চয় করার ধারণা। মেমরি বরাদ্দকারী এবং ডেটা কাঠামোর মধ্যে ফলস্বরূপ সেখানে আরও অনেক ঝাপসা রয়েছে।

তবে ভেরিয়েবল-আকারের জিনিসগুলির একটি গুচ্ছ সংরক্ষণ করা বা এমনকী জিনিস যা কেবল পরিবর্তনশীল আকারের হতে পারে পলিমারফিকের মতো Dogএবং Catদক্ষতার সাথে করা শক্ত। তারা এই পরিবর্তনশীল আকারের হতে পারে এবং একটি সাধারণ এলোমেলো অ্যাক্সেস পাত্রে এগুলি স্বচ্ছন্দভাবে সংরক্ষণ করতে পারে এমন ধারণা ধরে আপনি যেতে পারবেন না কারণ এক উপাদান থেকে পরের দিকে যাওয়ার পদক্ষেপটি ভিন্ন হতে পারে। কুকুর এবং বিড়াল উভয়ই রয়েছে এমন একটি তালিকা সংরক্ষণ করার জন্য আপনাকে 3 টি পৃথক তথ্য কাঠামো / বরাদ্দ দৃষ্টান্ত ব্যবহার করতে হতে পারে (কুকুরের জন্য একটি, বিড়ালের জন্য একটি, এবং একটি বেস পয়েন্টার বা স্মার্ট পয়েন্টারগুলির একটি পলিমারফিক তালিকার জন্য, বা আরও খারাপ) , প্রতিটি কুকুর এবং বিড়ালকে সাধারণ উদ্দেশ্যে বরাদ্দকারীদের বিরুদ্ধে বরাদ্দ দিন এবং তাদের সমস্ত স্মৃতিতে ছড়িয়ে দিন), যা ব্যয়বহুল হয়ে যায় এবং এর ভাগকে বহুগুণে ক্যাশে মিস করে।

সুতরাং সি ব্যবহার করার একটি কৌশল, যদিও এটি হ্রাসপ্রাপ্ত ধনীতা এবং সুরক্ষা এ আসে, তা হ'ল বিট এবং বাইটের স্তরে সাধারণকরণ। আপনি এটি ধরে নিতে সক্ষম হতে পারেন Dogsএবং Catsএকই সংখ্যক বিট এবং বাইটের প্রয়োজন, একই ক্ষেত্র থাকতে পারে, একই ফাংশন পয়েন্টার টেবিলের জন্য একই পয়েন্টার। তবে বিনিময়ে আপনি তারপর কম ডাটা স্ট্রাকচার কোড করতে পারেন, তবে ঠিক ততটাই গুরুত্বপূর্ণ, দক্ষতা এবং স্বচ্ছলতার সাথে এই সমস্ত জিনিস সংরক্ষণ করুন। আপনি কুকুর এবং বিড়ালদের সাথে সাদৃশ্যযুক্ত ইউনিয়নের মতো চিকিত্সা করছেন (বা আপনি সম্ভবত একটি ইউনিয়ন ব্যবহার করতে পারেন)।

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

অলৌকিক / স্পষ্টত নকল

এখন আমি এমন জিনিসগুলির জন্য শিথিল অর্থে "সদৃশ" ব্যবহার করছি যা অপ্রয়োজনীয়ও হতে পারে না। আমি "প্রকৃত সদৃশ" থেকে "ঘটনামূলক / আপাত" সদৃশ এর মতো পদগুলিকে লোক দেখতে পেয়েছি। আমি যেভাবে দেখছি তা হ'ল অনেক ক্ষেত্রে এর মতো পরিষ্কার পার্থক্য নেই। আমি "সম্ভাব্য স্বতন্ত্রতা" বনাম "সম্ভাব্য নকল" এর মতো পার্থক্যটি দেখতে পাচ্ছি এবং এটি যে কোনও উপায়ে যেতে পারে। এটি প্রায়শই নির্ভর করে যে আপনি কীভাবে আপনার নকশা এবং বাস্তবায়নগুলি বিকাশ করতে চান এবং নির্দিষ্ট ব্যবহারের ক্ষেত্রে সেগুলি কতটা নিখুঁতভাবে তৈরি করা যায়। তবে আমি প্রায়শই খুঁজে পেয়েছি যে কোড নকল হওয়ার পরে যা প্রদর্শিত হতে পারে তা পরে পুনরায় উন্নতির বেশ কয়েকটি পুনরাবৃত্তির পরে বাড়াবাড়ি হতে পারে না।

এর আনলজিকাল reallocসমতুল্য ব্যবহার করে একটি সাধারণ বর্ধনযোগ্য অ্যারে বাস্তবায়ন নিন std::vector<int>। প্রাথমিকভাবে এটি std::vector<int>সি ++ ব্যবহার করে বলার অপেক্ষা রাখে না। তবে আপনি পরিমাপের মাধ্যমে খুঁজে পেতে পারেন যে a৪ বিট ইন্টিজারগুলি গাদা বরাদ্দ ছাড়াই sertedোকানোর অনুমতি দেওয়ার জন্য আগে থেকে 64৪ বাইট প্রিলোকল্ট করা সুবিধাজনক হতে পারে। এখন এটি আর নিরর্থক নয়, কমপক্ষে নয় std::vector<int>। এবং তখন আপনি বলতে পারেন, "তবে আমি এটিকে কেবল একটি নতুনতে সাধারণীকরণ করতে পেরেছিলাম SmallVector<int, 16>, এবং আপনিও পারেন But তবে তারপরে বলুন যে আপনি এটি দরকারী বলে মনে করেন কারণ এগুলি খুব ছোট, স্বল্প-জীবনী অ্যারেগুলির পরিবর্তে গাদা বরাদ্দে অ্যারে ক্ষমতা চতুর্থাংশ তৈরি করার জন্য are 1.5 দ্বারা বৃদ্ধি পাচ্ছে (মোটামুটি পরিমাণ যা অনেকগুলিvectorবাস্তবায়নগুলি ব্যবহার করে) এই ধারনাটি কাজ করার সময় যে অ্যারে ক্ষমতা সর্বদা দুটির একটি শক্তি। এখন আপনার ধারকটি সত্যিই আলাদা, এবং সম্ভবত এটির মতো কোনও ধারক নেই। এবং আপনি প্রাকচালিতকরণ ভারীকরণ কাস্টমাইজ করতে, পুনঃব্যবস্থাপনা আচরণ ইত্যাদি কাস্টমাইজ করার জন্য আরও অনেক বেশি টেম্পলেট প্যারামিটার যুক্ত করে এই ধরনের আচরণগুলিকে সাধারণীকরণের চেষ্টা করতে পারেন তবে সেই মুহুর্তে আপনি সাধারণ সি এর এক ডজন লাইনের তুলনায় ব্যবহার করার জন্য সত্যিই অযৌক্তিক কিছু খুঁজে পেতে পারেন কোড।

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

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

পিওডি এবং পুরানো

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

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

struct IternedString 
{
    int32_t index;
};

... আমাদের হ্যাশ টেবিলগুলিতে, লাল-কালো গাছগুলি, তালিকাগুলি বাদ দিন ইত্যাদি, যদি আমাদের লিক্সোগ্রাফিকাল বাছাইয়ের প্রয়োজন না হয়? এখন সব যা আমরা 32 বিট ইন্টিজার এর সাথে কাজ করা কোডেড এখন এই অন্তরীণ স্ট্রিং কী যা কার্যকরভাবে মাত্র 32 বিট হয় সংরক্ষণ করতে পারেন আমাদের অন্যান্য ডাটা স্ট্রাকচার ints। এবং আমি আমার ব্যবহারের ক্ষেত্রে কমপক্ষে (কেবলমাত্র আমার ডোমেন হতে পারি যেহেতু আমি রাইট্র্যাকিং, জাল প্রক্রিয়াজাতকরণ, ইমেজ প্রসেসিং, কণা সিস্টেম, স্ক্রিপ্টিং ভাষার সাথে বাধ্যতামূলক, নিম্ন স্তরের মাল্টিথ্রেডেড জিইউআই কিট বাস্তবায়ন ইত্যাদি ইত্যাদি ক্ষেত্রে কাজ করি - নিম্ন স্তরের জিনিসগুলি কিন্তু কোনও ওএসের মতো নিম্ন-স্তরের নয়), কোডটি কাকতালীয়ভাবে আরও কার্যকর এবং সহজ হয়ে ওঠে কেবল এই জাতীয় জিনিসের সূচকগুলি সংরক্ষণ করে। এটা তোলে তাই আমি প্রায়ই কাজ করছি বলে সময় 75% মাত্র সঙ্গে, int32_tএবংfloat32 আমার অ-তুচ্ছ ডেটা স্ট্রাকচারে, বা কেবল একই আকারের জিনিসগুলি সঞ্চয় করে (প্রায় সর্বদা 32-বিট)।

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

পরীক্ষা এবং নির্ভরযোগ্যতা

একটি শেষ জিনিস আমি অফার করব এবং এটি সবার পক্ষে নাও থাকতে পারে, সেগুলি হ'ল ডেটা স্ট্রাকচারের জন্য লেখার পরীক্ষার পক্ষে। এগুলিকে কোনও কিছুতে সত্যিই ভাল করুন। তারা অতি নির্ভরযোগ্য কিনা তা নিশ্চিত করুন।

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

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

মিনিমালিজমের জন্য কোড সদৃশ?

এটি একটি মজার চিন্তা যা আমার মাথায় উঠে গেছে, তবে এমন একটি ক্ষেত্রে বিবেচনা করুন যেখানে আমরা সম্ভবত সি এবং সি ++ লাইব্রেরির মুখোমুখি হতে পারি যা প্রায় একই কাজ করে: উভয়েরই প্রায় একই কার্যকারিতা, একই পরিমাণে ত্রুটি পরিচালনা করা, একটি উল্লেখযোগ্যভাবে হয় না অন্যের চেয়ে আরও দক্ষ ইত্যাদি efficient এবং সর্বোপরি, দু'টিই দক্ষতার সাথে বাস্তবায়িত, ভাল-পরীক্ষিত এবং নির্ভরযোগ্য। দুর্ভাগ্যক্রমে আমাকে এখানে অনুমানমূলকভাবে কথা বলতে হবে যেহেতু আমি কখনই নিখুঁত পাশাপাশি পাশের তুলনায় কোনও কিছুই পাইনি। তবে এই পাশের তুলনায় আমি যে নিকটতম জিনিসগুলি পেয়েছি তার মধ্যে প্রায়শই সি লাইব্রেরি অনেক বেশি ছিল, সি ++ সমতুল্য (কখনও কখনও এটির কোড আকারের 1/10 তম) এর চেয়ে অনেক ছোট।

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

আমি অন্য দিন গিথুবে কারওর রেট্রেসারকে দেখছিলাম এবং এটি সি ++ এ প্রয়োগ করা হয়েছিল এবং তাই খেলনা রাইট্রেসারের জন্য এত কোড required এবং কোডটি দেখার জন্য আমি এতটা সময় ব্যয় করি নি তবে সেখানে সাধারণ-উদ্দেশ্য কাঠামোগুলির একটি নৌকা ভার ছিল যেগুলি হ্যান্ডলিংয়ের উপায় ছিল, রেট্রেসারের প্রয়োজনের চেয়ে বেশি উপায়। এবং আমি কোডিংয়ের সেই স্টাইলটি চিনতে পারি কারণ আমি সি ++ একই ধরণের ব্যবহার করতাম এক ধরণের সুপার বট আপ আপ ফ্যাশনে, প্রথমে খুব সাধারণ-উদ্দেশ্য ডেটা স্ট্রাকচারের একটি পূর্ণ-বিকাশযুক্ত গ্রন্থাগার তৈরি করার দিকে মনোনিবেশ করে যা উপরে এবং তাত্ক্ষণিকভাবে এগিয়ে যায় হাতের মুঠোয় এবং তারপরে আসল সমস্যাটি দ্বিতীয়বার মোকাবেলা করুন। তবে এই সাধারণ কাঠামোগুলি এখানে এবং সেখানে কিছু অপ্রয়োজনীয়তা দূর করতে পারে এবং নতুন প্রসঙ্গে অনেকগুলি পুনরায় ব্যবহার উপভোগ করতে পারে, বিনিময়ে তারা অযৌক্তিক কোড / কার্যকারিতা সহ একটি নৌকোড়ার সাথে কিছুটা রিলানডেসির বিনিময় করে প্রজেক্টটিকে প্রচুর পরিমাণে উত্সাহিত করে এবং পূর্ববর্তীটি পূর্বেরের তুলনায় এটি বজায় রাখা অগত্যা সহজ নয়। বিপরীতে আমি প্রায়শই এটি বজায় রাখা শক্ত হয়, যেহেতু সাধারণের কোনও নকশা বজায় রাখা কঠিন যা প্রয়োজনের বিস্তৃত বিস্তারের বিপরীতে ভারসাম্য নকশার সিদ্ধান্তগুলি দৃ tight় করতে হবে।

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