আমি বিশ্বাস করি যে আমি সি এবং সি ++ কোড মিশ্রিত করেছি যখন আমার থাকা উচিত ছিল না; এটি কি সমস্যা এবং কীভাবে সংশোধন করা যায়?


10

পটভূমি / দৃশ্যপট

আমি সিটিতে সরাসরি সিএলআই অ্যাপ্লিকেশন লেখা শুরু করেছি (আমার প্রথম উপযুক্ত সি বা সি ++ প্রোগ্রাম যা "হ্যালো ওয়ার্ল্ড" বা এর কোনও প্রকরণ নয়)। মাঝপথে প্রায় আমি ব্যবহারকারীর ইনপুট (চর অ্যারে) এর "স্ট্রিং" নিয়ে কাজ করছিলাম এবং আমি সি ++ স্ট্রিং স্ট্রিমার অবজেক্টটি আবিষ্কার করেছি। আমি দেখেছি যে এগুলি ব্যবহার করে আমি কোড সংরক্ষণ করতে পারি, তাই আমি এগুলি অ্যাপ্লিকেশনটির মাধ্যমে ব্যবহার করেছি। এর অর্থ এই যে আমি ফাইল এক্সটেনশনটি .cpp এ পরিবর্তন করেছি এবং এখন এর g++পরিবর্তে অ্যাপটি সংকলন করেছি gcc। সুতরাং এর ভিত্তিতে, আমি বলব অ্যাপ্লিকেশনটি এখন প্রযুক্তিগতভাবে একটি সি ++ অ্যাপ্লিকেশন (যদিও কোডের 90% + আমি সি বলেছি তাতে লেখা আছে, কারণ আমার সীমিত অভিজ্ঞতার কারণে দুটি ভাষার মধ্যে প্রচুর ক্রস-ওভার রয়েছে) দুই). এটি 900 লাইন দীর্ঘ লম্বা একটি একক .cpp ফাইল।

গুরুত্বপূর্ণ বিষয়গুলি

আমি চাই প্রোগ্রামটি বিনামূল্যে (অর্থ হিসাবে) এবং অবাধে বিতরণযোগ্য এবং সবার কাছে ব্যবহারযোগ্য able আমার উদ্বেগ হ'ল কেউ কোডটি দেখবে এবং এর প্রভাবটির জন্য কিছু ভাববে:

ওহ কোডিংটি দেখুন, এটি দুর্দান্ত, এই প্রোগ্রামটি আমাকে সাহায্য করতে পারে না

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

আমার প্রশ্ন

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

কোড - আপডেট

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


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

আপনি এটি FORTRAN- এ পুনরায় লিখতে পারেন I
অট--

2
আপনার সফ্টওয়্যারটি যদি "সুন্দর" না হয় তবে আমি তাদের নিয়ে খুব বেশি চিন্তা করব না। আপনার 99% ব্যবহারকারী এমনকি কোডটির দিকে তাকাবেন না বা এটি কীভাবে লেখা হবে তা যত্ন নেবে না যতক্ষণ না তাদের এটি করার প্রয়োজন হয় তা পূরণ করে। এটি দীর্ঘমেয়াদী বজায় রাখতে আপনাকে সহায়তা করার জন্য কোডটি সুসংগত হওয়া ইত্যাদি গুরুত্বপূর্ণ ।
এভিকাটোস

1
উদাহরণস্বরূপ গিথুব কোড সহ আপনি কেন নিজের জিনিসকে ফ্রি সফটওয়্যার তৈরি করবেন না (যেমন জিপিএলভি 3 লাইসেন্সের আওতায় ) । আপনার কোডটিতে একটি ফাইলের অভাব রয়েছে । আপনি আকর্ষণীয় প্রতিক্রিয়া পেতে পারেন। LICENSE
বেসাইল স্টারিনকিভিচ

উত্তর:


13

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

তারপরে অবশেষে কিছু বিদ্যমান ফাইলগুলি সি ++ হিসাবে পুনরায় সংমিশ্রিত হয়ে যায় এবং কিছু সেতু মুছে ফেলা যেতে পারে ... তবে এটি সত্যই দীর্ঘ সময় নিতে পারে।

আপনি কিছুটা এগিয়ে আছেন, আপনার সম্পূর্ণ সিস্টেমটি এখন সি ++, কেবল বেশিরভাগ অংশে "সি-স্টাইল" লেখা আছে। এবং আপনি শৈলীর মিশ্রণকে একটি সমস্যা দেখেন, যা আপনার করা উচিত নয়: সি ++ হ'ল বহু শৈলীতে অনেকগুলি শৈলীর সমর্থন করে এবং এটি ভাল করার জন্য তাদের সহাবস্থান করতে দেয়। আসলে এটিই প্রধান শক্তি, যে আপনাকে একক শৈলীতে বাধ্য করা হয় না। এক যে এখানে এবং সেখানে suboptimal হবে, কিছু ভাগ্য সর্বত্র নয় not

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

আপনি যদি সাধারণ বিষয়গুলি সম্বোধন করতে চান তবে একটি সি কোডবেস থেকে উচ্ছেদের কী তা এখানে:

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

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

এর বাইরে কেবলমাত্র কিছু স্বাস্থ্যকর সি ++ এ নতুন কোড লিখুন এবং যদি এমন কিছু শ্রেণীর জন্ম হয় যা বিদ্যমান কোডে ভাল প্রতিস্থাপন করে তবে সেগুলি বেছে নিন।

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

আমি সুটার / আলেকজান্দ্রেস্কুর সি ++ কোডিং স্ট্যান্ডার্ডগুলি এখনও সম্পন্ন না করে পড়ার পরামর্শ দিচ্ছি এবং সেগুলি নিবিড়ভাবে অনুসরণ করুন।


বালোগ ইনপুটটির জন্য অনেক ধন্যবাদ, আমার দৃষ্টিতে সমস্ত দৃ sound় পরামর্শ এবং আমি এগুলির সাথে একমত আছি। আমি মনে করি বিভাগের কোড কোডটি ধীরে ধীরে পরিবর্তিত করার চেষ্টা করব যা আমি মনে করি ওয়ার্কিং কোডটিকে অগ্রাধিকার দিচ্ছি।
jwbensley

7

সংক্ষেপে: আপনি জাহান্নামে যাচ্ছেন না, খারাপ কিছু ঘটবে না, তবে আপনি কোনও সৌন্দর্য প্রতিযোগিতাও জিততে পারবেন না।

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

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


পরামর্শের জন্য ধন্যবাদ tdammers। আপনি যা বলছেন তাতে আমি একমত এবং আমি এটি বোর্ডে নিয়ে যাচ্ছি, ধন্যবাদ!
jwbensley

4

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

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

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

শুধু মনে রাখবেন, একটি ভাল ফোর্টরান প্রোগ্রামার যে কোনও ভাষায় ভাল ফোর্টরান কোড লিখতে পারে। :)


2

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

  • এর পরিবর্তে স্ট্রিম ব্যবহার করবেন? printfপরিবার.
  • newপরিবর্তে ব্যবহার করুন malloc
  • সমস্ত ডেটা স্ট্রাকচারের জন্য এসটিএল কনটেইনার ক্লাস ব্যবহার করুন।
  • যেখানেই সম্ভব std::stringতার পরিবর্তে ব্যবহার করুনchar*
  • RAII বুঝতে এবং ব্যবহার করুন

যদি আপনার প্রোগ্রামটি সংক্ষিপ্ত হয় (এবং ~ 900 লাইনগুলি ছোট মনে হয়) আমি ব্যক্তিগতভাবে মনে করি না ক্লাসগুলির একটি শক্ত সেট তৈরি করার চেষ্টা করা প্রয়োজন বা এমনকি দরকারী।


স্টিভেন পরামর্শের জন্য ধন্যবাদ, হ্যাঁ ক্লাস সম্পর্কে আমারও একই ধারণা ছিল এবং আমি মনে করি আমি কোডটি একটি পরিষ্কার সিঙ্গল ফাইলে পরিষ্কার করতে পারি। ধন্যবাদ!
jwbensley

2

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

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

আপনি আপনার পুরো প্রকল্পটি ইডিয়োমেটিক সি ++ (বা সি) এ পুনরায় লেখার সিদ্ধান্ত নেওয়ার আগে আপনাকে সচেতন হওয়া উচিত যে অন্যান্য উত্তরে উপস্থাপিত অনেকগুলি পরিবর্তন আপনার প্রোগ্রামকে ধীর করে দিতে পারে বা অন্য অযাচিত প্রভাবের কারণ হতে পারে। উদাহরণ স্বরূপ:

  • স্ট্যাক-বরাদ্দ সি-স্ট্রিংগুলি স্টাডি :: স্ট্রিংগুলিতে পরিবর্তন করা অপ্রয়োজনীয় হ্যাপ বরাদ্দের কারণ হতে পারে
  • রেফারেন্স গণনা, অভ্যন্তরীণ ভার্চুয়াল সদস্য ফাংশন এবং থ্রেড সুরক্ষার কারণে কিছু ভাগ করা পয়েন্টার প্রকারের (যেমন স্টাড :: শেয়ার্ড_পিটিআর) কাঁচা পয়েন্টার পরিবর্তন করা ওভারহেড অ্যাক্সেসের কারণ করে
  • স্ট্যান্ডার্ড লাইব্রেরির স্ট্রিমগুলি সি তুলকগুলির চেয়ে ধীর
  • কনটেইনারগুলির মতো RAII ক্লাসের গাফিলতি ব্যবহার অপ্রয়োজনীয় ক্রিয়াকলাপ ঘটাতে পারে, বিশেষত যখন সি ++ 11 এর পদক্ষেপ শব্দ ব্যবহার করা যায় না
  • টেমপ্লেটগুলি সংকলকগুলির মধ্যে দীর্ঘ সময় সংকলন, অস্পষ্ট সংকলন ত্রুটিগুলি, কোড ব্লোট এবং বহনযোগ্যতার সমস্যা সৃষ্টি করতে পারে
  • ব্যতিক্রম-নিরাপদ কোড লেখা কঠিন, যা রূপান্তরকালে সূক্ষ্ম বাগগুলি প্রবর্তন সহজ করে তোলে makes
  • প্লেন সি এর চেয়ে ভাগ করা লাইব্রেরি থেকে সি ++ কোড ব্যবহার করা কৌতুকপূর্ণ
  • সি ++ যেমন C89 এর মতো বহুল সমর্থনযোগ্য নয়

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


"স্ট্যান্ডার্ড লাইব্রেরি স্ট্রিমগুলি সি-কাউন্টারগুলির তুলনায় ধীর": সম্ভবত যেভাবেই হোক প্রিন্টফের চেয়ে আন্তর্জাতিকীকরণের পক্ষে আরও শক্ত er
হস্তান্তরকারী

1

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

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


সুতরাং আমার কাছে এই একটি গ্রন্থাগার রয়েছে যা আমি সিটিতে লেখা আছে যা ব্যবহার করতে চাই এবং আমার কাছে এই অন্যান্য লাইব্রেরি রয়েছে যা আমি সি ++ তে লেখা আছে তা ব্যবহার করতে চাই ... রাইটিং কোড যা ঠিক কাজ করে তা কেবল অপ্রয়োজনীয় কাজ তৈরি করা।
gnasher729

1

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

এই দুটি ভাষাগুলি যেখানে ভাল জাল হয় না তা মনে রাখার মূল বিষয়।

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

২. আপনি যদি সি কোড লিখে থাকেন যা ডেটা টাইপকে কেবল কাঁচা বিট এবং বাইট হিসাবে ব্যবহার করে টাইপ সিস্টেমে বুলডোজিং করে (এটি আসলে আমার প্রথম স্থানে সি ব্যবহারের মূল কারণ) তবে আপনি কখনই সি ++ ডেটার বিপরীতে এই জাতীয় কোড ব্যবহার করতে চান না প্রকারভেদে কপির কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর এবং ভার্চুয়াল পয়েন্টার এবং সেই ধরণের জিনিস থাকতে পারে যার সম্মান করা দরকার। সুতরাং সাধারণত এটি এই ধরণের সি কোড ব্যবহার করে সি কোড হওয়া উচিত, এই ধরণের সি কোড ব্যবহার করে সি ++ কোড নয়।

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

আমি কি সবগুলি সি ++ এ পুনরায় লেখার দিকে তাকিয়ে দেখি (এর দ্বারা, আমি আরও সি ​​++ অবজেক্ট এবং পদ্ধতিগুলি বাস্তবায়িত করব যেখানে সম্ভবত আমি সি স্টাইলে এমন কিছু কোড করেছি যা নতুন সি ++ কৌশল ব্যবহার করে ঘনীভূত করা যেতে পারে), বা স্ট্রিং স্ট্রিমার অবজেক্টগুলির ব্যবহার এবং মুছে ফেলতে এবং এটিকে সব কি "কোড" সি কোড এনে দেবেন?

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

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

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