পুনরাবৃত্তি কোডটি টাইপ করা আরও সহজ করার জন্য কি # ডিফাইন এর উপযুক্ত ব্যবহার?


17

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

<< " " <<

কাউট স্টেটমেন্টে শব্দের মধ্যে একটি স্থান সন্নিবেশ করানোর জন্য। আমি ঠিক করতে পারি

#define pSpace << " " <<

এবং টাইপ

cout << word1 pSpace word2 << endl;

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

এই সম্পর্কে কোন চিন্তা?

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


74
এটি আপনার কাছে পরিষ্কার কারণ আপনি এটি আবিষ্কার করেছিলেন। অন্য সবার কাছে এটি কেবল নিবিষ্ট ছিল। প্রথমে এটি সিনট্যাক্স ত্রুটির মতো দেখাচ্ছে। যখন এটি সংকলিত হয় আমি তখন হ্যাকটি কী তা ভাবব এবং তারপরে আপনার কাছে এমন একটি ম্যাক্রো রয়েছে যা সমস্ত ক্যাপগুলিতে নেই। আমার মতে এটি কোডটি বজায় রাখার জন্য কেবল ভয়ঙ্কর করে তোলে যদি আমি কোড পর্যালোচনার জন্য আসে তবে আমি অবশ্যই এটিকে প্রত্যাখ্যান করব এবং আমি আশা করি না যে আপনি এটি গ্রহণ করবেন এমন অনেকগুলি খুঁজে পাবেন। এবং আপনি 3 টি অক্ষর সংরক্ষণ করছেন !!!!!!!!!
মার্টিন ইয়র্ক

11
যেখানে আপনি ফাংশনগুলি বা যা কিছু ব্যবহার করে পুনরাবৃত্তিটি যুক্তিসঙ্গতভাবে নির্ধারণ করতে পারবেন না, আপনার সম্পাদক বা আইডিই আপনাকে সহায়তা করার জন্য কী করতে পারে তা শিখাই ভাল better পাঠ্য সম্পাদক ম্যাক্রো বা "স্নিপেট" হট এত টাইপ থেকে আপনি সংরক্ষণ করতে পারবেন ছাড়া পাঠযোগ্যতা ক্ষতিকর।
স্টিভ 314

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

9
আপনি 3 টি অক্ষর সংরক্ষণ করেছেন এবং বিভ্রান্তিমূলক বক্তব্যগুলির জন্য সেগুলিতে ব্যবসা করেছেন। খারাপ ম্যাক্রোর খুব ভাল উদাহরণ,
imho

7
ঠিক এই দৃশ্যের জন্য অনেক সম্পাদকের একটি উন্নত বৈশিষ্ট্য রয়েছে, একে "অনুলিপি এবং আটকান" বলা হয়
ক্রিস বার্ট-ব্রাউন

উত্তর:


111

কোড লিখন সহজ। পঠন কোড কঠিন।

আপনি একবার কোড লিখুন। এটি বহু বছর ধরে বেঁচে থাকে, লোকেরা এটি একশবার পড়ে read

লেখার জন্য নয়, পড়ার জন্য কোডটি অনুকূলিত করুন।


11
আমি এক 100% সম্মত। (প্রকৃতপক্ষে, আমি নিজেই এই উত্তরটি লিখতে যাচ্ছিলাম once) কোডটি একবার লেখা হয় তবে এটি কয়েক ডজন, কয়েকশো বা হাজার হাজার বার পড়তে পারে, সম্ভবত কয়েক ডজন দ্বারা, শত দ্বারা, এমনকি হাজার হাজার বিকাশকারী দ্বারাও এটি পড়তে পারে। কোড লিখতে যে সময় লাগে তা সম্পূর্ণ অপ্রাসঙ্গিক, কেবল জিনিসটি পড়তে ও বোঝার সময়টি গণনা করে।
এসবিআই

2
প্রিপ্রোসেসরটি পড়া এবং রক্ষণাবেক্ষণের জন্য কোডটি অনুকূলকরণের জন্য ব্যবহার করা যেতে পারে এবং করা উচিত।
এসকে-যুক্তি

2
এবং যদি এটি কেবল আপনি এক বা দুই বছরে কোডটি পড়ে থাকেন তবে: এই জিনিসগুলি নিজেই ভুলে যাবেন মাঝখানে অন্য জিনিসগুলি করার সময়।
johannes

2
"সর্বদা কোডটি মনে করুন যেন যে লোকটি আপনার কোডটি বজায় রাখে শেষ করে সে হিংস্র মনোবিজ্ঞানী যিনি জানেন আপনি কোথায় থাকেন" " - (মার্টিন গোল্ডিং)
ডিলান ইয়াগা

@ ডিলান - অন্যথায়, কোডটি বজায় রাখার কয়েক মাস পরে, তিনি আপনাকে খুঁজে পাবেন - (আমাকে)
স্টিভ 314

28

ব্যক্তিগতভাবে, আমি এটি ঘৃণা করি। আমি এই কৌশল থেকে মানুষকে নিরুৎসাহিত করার বিভিন্ন কারণ রয়েছে:

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

  2. এটি অপঠনযোগ্য। এটি আপনার কাছে পরিষ্কার হতে পারে .. আপাতত .. যদি এটি কেবল এই একটি সংজ্ঞা হয়। এটি যদি অভ্যাস হয়ে যায়, আপনি শীঘ্রই কয়েক ডজন # টি নির্দিষ্ট সংজ্ঞা দিয়ে শেষ করবেন এবং নিজের ট্র্যাকটি হারাতে শুরু করবেন। তবে সর্বোপরি, অন্য কেউই বুঝতে পারবেন না যে word1 pSpace word2আসলে কী বোঝায় (# ডেফাইনটি সন্ধান না করে)।

  3. এটি বাহ্যিক সরঞ্জামগুলির জন্য সমস্যা হয়ে উঠতে পারে। বলুন যে আপনি কোনওভাবেই একটি # নির্দিষ্ট সংজ্ঞাটি শেষ করেন যাতে একটি বন্ধনী বন্ধনী অন্তর্ভুক্ত থাকে তবে কোনও প্রারম্ভিক বন্ধনী নেই। সবকিছু ঠিকঠাক কাজ করতে পারে তবে সম্পাদক এবং অন্যান্য সরঞ্জামগুলি function(withSomeCoolDefine;এটিকে বিচিত্র হিসাবে কিছু দেখতে পারে (যেমন, তারা ত্রুটিগুলি এবং কী জানবে না)। (অনুরূপ উদাহরণ: একটি সংজ্ঞায়নের ভিতরে একটি ফাংশন কল - আপনার বিশ্লেষণ সরঞ্জামগুলি কি এই কলটি সন্ধান করতে সক্ষম হবে?)

  4. রক্ষণাবেক্ষণ অনেক শক্ত হয়ে যায়। আপনার রক্ষণাবেক্ষণটি আনার সাথে সাথে স্বাভাবিক সমস্যাগুলির সাথে যুক্ত সমস্ত সংজ্ঞা রয়েছে। উপরের বিষয়টির সাথে সাথে, রিফ্যাক্টরিংয়ের জন্য সরঞ্জাম সমর্থনটিও নেতিবাচকভাবে প্রভাবিত হতে পারে।


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

16

এ সম্পর্কে আমার প্রধান চিন্তাভাবনাটি হ'ল আমি কোড লেখার সময় কোনও নিয়ম হিসাবে "মেক টাইপিং সহজ" ব্যবহার করি না।

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

এই হিসাবে, আপনি যে # নির্দিষ্ট সংজ্ঞাটি ব্যবহার করেন সেটি বিকল্প <<এবং অন্যান্য স্টাফের সাধারণ উপায়টি কেবলমাত্র ভাঙে । এটি কমপক্ষে অবাক হওয়ার নিয়ম ভঙ্গ করে, এবং আইএমএইচও কোনও ভাল জিনিস নয়।


1
+1: "কোডটি আরও বেশি পরিমাণে একটি ক্রম পাঠ করা হয় যা এটি লেখা হয়" !!!!
জর্জিও

14

আপনি ম্যাক্রোগটিকে কীভাবে খারাপ ব্যবহার করতে পারেন তার একটি পরিষ্কার উদাহরণ এই প্রশ্ন দেয়। অন্যান্য উদাহরণ দেখতে (এবং বিনোদন করা) এই প্রশ্নটি দেখুন

এটি বলার পরে, আমি ম্যাক্রোগুলিকে ভাল সংযুক্তি হিসাবে বিবেচনা করি তার বাস্তব বিশ্বের উদাহরণ দেব।

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

#include <cppunit/extensions/HelperMacros.h>

class ComplexNumberTest : public CppUnit::TestFixture  
{
    CPPUNIT_TEST_SUITE( ComplexNumberTest );
    CPPUNIT_TEST( testEquality );
    CPPUNIT_TEST( testAddition );
    CPPUNIT_TEST_SUITE_END();

 private:
     Complex *m_10_1, *m_1_1, *m_11_2;
 public:
     void setUp();
     void tearDown();
     void testEquality();
     void testAddition();
}

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

এই ম্যাক্রো ব্লকগুলি এরকম কিছুতে প্রসারিত হয়:

public: 
  static CppUnit::Test *suite()
  {
    CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite( "ComplexNumberTest" );
    suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>( 
                                   "testEquality", 
                                   &ComplexNumberTest::testEquality ) );
    suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>(
                                   "testAddition",
                                   &ComplexNumberTest::testAddition ) );
    return suiteOfTests;
  }

আপনি কোনটি পড়তে এবং বজায় রাখতে পছন্দ করবেন?

আর একটি উদাহরণ মাইক্রোসফ্ট এমএফসি ফ্রেমওয়ার্কে রয়েছে, যেখানে আপনি বার্তাগুলিতে ফাংশনগুলি ম্যাপ করেন:

BEGIN_MESSAGE_MAP( CMyWnd, CMyParentWndClass )
    ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )
    ON_COMMAND_RANGE(ID_FILE_MENUITEM1, ID_FILE_MENUITEM3, OnFileMenuItems)
    // ... Possibly more entries to handle additional messages
END_MESSAGE_MAP( )

সুতরাং, "গুড ম্যাক্রোস" কে ভয়াবহ অশুভ প্রকারের থেকে পৃথককারী জিনিসগুলি কী কী?

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

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


5

এটি সর্বদাই ভাল হবে, আপনি যদি বার বার পুনরায় টাইপ করার জন্য ক্লান্তিকর মনে করেন এমন কোডের স্নিপেটগুলি সন্নিবেশ করানোর জন্য আপনার পছন্দের আইডিই / পাঠ্য সম্পাদককে টিউন করেন তবে ভাল। তুলনার জন্য এবং "ভদ্র" শব্দটি আরও ভাল। প্রকৃতপক্ষে, बीट्स এডিটরটির ম্যাক্রো প্রিপ্রোসেসিংয়ের সময় আমি অনুরূপ কোনও মামলা সম্পর্কে ভাবতে পারি না। ভাল, এক হতে পারে - যখন কিছু রহস্যময় এবং অসুখী কারণে আপনি ক্রমাগত কোডিংয়ের জন্য বিভিন্ন সেট সরঞ্জাম ব্যবহার করছেন। তবে এটি কোনও ন্যায়সঙ্গত নয় :)

এটি আরও জটিল পরিস্থিতিগুলির জন্য আরও ভাল সমাধান হতে পারে, যখন পাঠ্য প্রিপ্রোসেসিং কাজটি আরও বেশি অপঠনযোগ্য এবং জটিল করতে পারে (প্যারামেট্রাইজড ইনপুট সম্পর্কে ভাবেন)।


2
+1 টি। প্রকৃতপক্ষে: সম্পাদক আপনার জন্য কাজটি করতে দিন। উদাহরণস্বরূপ যদি আপনি একটি সংক্ষিপ্তকরণ তৈরি করেন তবে আপনি উভয় বিশ্বের সেরা পাবেন << " " <<
unPress325680

-1 এর জন্য "এটি আরও জটিল পরিস্থিতিগুলির জন্য আরও ভাল সমাধান হতে পারে, যখন পাঠ্য প্রিপ্রোসেসিং কাজটি আরও বেশি অপঠনযোগ্য এবং জটিল করতে পারে (প্যারামেট্রাইজড ইনপুট সম্পর্কে ভাবেন)" - যদি এটি জটিল হয় তবে এর জন্য একটি পদ্ধতি তৈরি করুন, তারপরেও, এটির জন্য একটি পদ্ধতি। উদাহরণস্বরূপ এই দুষ্টুটি আমি সম্প্রতি কোডে পেয়েছি ..... # ডিফাইন প্রিন্টআরার (এক্স) uts পুটস (এক্স);
এক্সট্রেন

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

4

অন্যরা আপনাকে ইতিমধ্যে কেন এটি করা উচিত নয় তা ব্যাখ্যা করেছে। আপনার উদাহরণটি অবশ্যই ম্যাক্রো দিয়ে প্রয়োগ করা প্রাপ্য নয়। কিন্তু এখানেই ক্ষেত্রে যেখানে আপনি বিস্তৃত হয় আছে পাঠযোগ্যতা একটি অনুরোধে জন্য ম্যাক্রো ব্যবহার করতে।

এই জাতীয় প্রযুক্তির বুদ্ধিমান প্রয়োগের একটি কুখ্যাত উদাহরণ হ'ল কলং প্রকল্প: দেখুন কীভাবে .defফাইলগুলি এখানে ব্যবহৃত হয়। ম্যাক্রোগুলির সাহায্যে এবং #includeআপনি অনুরূপ জিনিস সংগ্রহের জন্য একক, কখনও কখনও সম্পূর্ণ ঘোষণামূলক সংজ্ঞা প্রদান করতে পারেন যা প্রকারের ঘোষণাপত্র, caseযেখানে উপযুক্ত যেখানে স্টেটমেন্ট, ডিফল্ট ইনিশিয়েশনার ইত্যাদিতে নথিভুক্ত করা হবে এটি রক্ষণাবেক্ষণকে উল্লেখযোগ্যভাবে বৃদ্ধি করে: আপনি কখনও নতুন যুক্ত করতে ভুলবেন না উদাহরণস্বরূপ caseআপনি যখন একটি নতুন যুক্ত করেছেন তখন সর্বত্র বিবৃতিগুলি enum

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


3

এটির মতো # নির্দিষ্ট সংজ্ঞা ব্যবহার করা কখনই উপযুক্ত নয়। আপনার ক্ষেত্রে, আপনি এটি করতে পারেন:

class MyCout 
{
public:
  MyCout (ostream &out) : m_out (out), m_space_pending (false)
  {
  }

  template <class T>
  MyCout &operator << (T &value)
  { 
    if (m_space_pending)
      m_out << " ";

    m_out << value;
    m_space_pending = false;
    return *this;
  }

  MyCout &operator << (const char *value)
  {
    if (m_space_pending)
      m_out << " ";

    m_out << value;
    m_space_pending = true;
    return *this;
  }

  MyCout &operator << (char *value) { return operator << (static_cast <const char *> (value)); }
  MyCout &operator << (ostream& (*fn)(ostream&)) { m_out << fn; return *this; }

private:
  ostream
    &m_out;

  bool
    m_space_pending;
};

int main (int argc, char *argv [])
{
  MyCout
    space_separated (cout);

  space_separated << "Hello" << "World" << endl;
}

2

না।

কোডে ব্যবহারের উদ্দেশ্যে ম্যাক্রোগুলির জন্য, যথাযথতার পরীক্ষা করার জন্য একটি ভাল গাইডলাইন হ'ল বন্ধনী (এক্সপ্রেশনগুলির জন্য) বা ধনুর্বন্ধনী (কোডের জন্য) দিয়ে এর সম্প্রসারণ ঘিরে রাখা এবং দেখুন যে এটি এখনও সংকলন করবে:

// These don't compile:

#define pSpace (<< " " <<)
cout << word1 pSpace word2 << endl;

#define space(x) (" " << (x))
cout << word1 << space(word2) << endl;

// These do:

#define FOO_FACTOR (38)
x = y * FOO_FACTOR;

#define foo() (cout << "Foo" << endl)
foo();

#define die(c) { if ((c)) { exit(1); } }
die(foo > 8);

#define space(x) (" " + string((x)))
cout << "foo" << space("bar") << endl;

ঘোষণাপত্রে ব্যবহৃত ম্যাক্রোস (অ্যান্ড্রু শেফার্ডের উত্তরের উদাহরণের মতো) যতক্ষণ না তারা আশেপাশের প্রসঙ্গে (যেমন publicএবং এর মধ্যে স্যুইচিং private) বিরক্ত না করে নিয়মিত একটি আলগা সেট নিয়ে পালিয়ে যেতে পারে ।


1

খাঁটি "সি" প্রোগ্রামে এটি করা যুক্তিসঙ্গতভাবে বৈধ কাজ।

এটি একটি সি ++ প্রোগ্রামে অপ্রয়োজনীয় এবং বিভ্রান্তিকর।

সি ++ তে কোডের পুনরাবৃত্তি টাইপিং এড়ানোর অনেক উপায় রয়েছে। আপনার আইডিই দ্বারা সরবরাহিত সুবিধাগুলি ব্যবহার করা থেকে (এমনকি "vii সহ একটি সরল" %s/ pspace /<< " " <</g"টাইপিং যতটা বাঁচাতে পারে এবং এখনও স্ট্যান্ডার্ড পঠনযোগ্য কোড উত্পাদন করে)। আপনি এটি প্রয়োগ করতে একটি ব্যক্তিগত পদ্ধতি সংজ্ঞায়িত করতে পারেন বা আরও জটিল ক্ষেত্রে সি ++ টেম্পলেটটি একটি ক্লিনার এবং সহজতর হবে।


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

@ সুরক্ষিত - আমি সম্মত হই যে প্রদত্ত উদাহরণের ক্ষেত্রে এটি ভাল ধারণা নয়। তবে অভাবের টেমপ্লেট ইত্যাদির পরিপ্রেক্ষিতে সি
জেমস অ্যান্ডারসন ২

1

সি ++ এ এটি অপারেটর ওভারলোডিংয়ের মাধ্যমে সমাধান করা যেতে পারে। বা এমনকি বৈকল্পিক ফাংশন হিসাবে সাধারণ কিছু:

lineWithSpaces(word1, word2, word3, ..., wordn)উভয়ই সহজ এবং আপনাকে pSpacesবারবার টাইপ করা বাঁচায় ।

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

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


0

কোডিংকে সরলকরণের জন্য কোডের সম্পূর্ণ লাইনগুলি সংজ্ঞায়িত করতে # ডেফাইন ব্যবহার করা ভাল বা খারাপ প্রোগ্রামিং অনুশীলন সম্পর্কে কোনও ধারণা আছে কি?

হ্যাঁ, এটি খুব খারাপ। এমনকি লোকেরা এটি করতে দেখেছি:

#define R return

টাইপিং সংরক্ষণ করতে (আপনি কী অর্জন করার চেষ্টা করছেন)।

এই ধরনের কোড শুধুমাত্র মত জায়গায় জন্যে এই


-1

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


2
নেই কিছুই কোনো প্রোগ্রামিং টেকনিক মধ্যে অন্তর্নিহিত মন্দ। যতক্ষণ আপনি জানেন আপনি কী করছেন তা সমস্ত সম্ভাব্য সরঞ্জাম এবং পদ্ধতি ব্যবহার করা যেতে পারে। এটি কুখ্যাত goto, সমস্ত সম্ভাব্য ম্যাক্রো সিস্টেম ইত্যাদির ক্ষেত্রে প্রযোজ্য
এসকে-লজিক ২

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

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

-2

না, টাইপিং সংরক্ষণ করতে আপনাকে ম্যাক্রো ব্যবহার করার অনুমতি নেই ।

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

টাইপিং কমাতে বেশিরভাগ সম্পাদকের ম্যাক্রো, এমনকি বুদ্ধিমান কোড স্নিপেট রয়েছে।


"না, টাইপিং সংরক্ষণ করতে আপনাকে ম্যাক্রোগুলি ব্যবহার করার অনুমতি নেই " " - ভাল কাজ আমি এখানে আপনার আদেশ শুনতে যাচ্ছি না! আমার কাছে যদি এমন একটি অবজেক্টের গাদা থাকে যা আমার কাছে ঘোষিত / সংজ্ঞায়িত / মানচিত্র / switch/ ইত্যাদি দরকার হয় তবে আপনি বাজি ধরতে পারেন যে আমি পাগল হওয়া এড়াতে ম্যাক্রোগুলি ব্যবহার করতে যাচ্ছি - এবং পাঠযোগ্যতা বাড়াতে পারি। কীওয়ার্ডগুলিতে টাইপিং সংরক্ষণ, প্রবাহ নিয়ন্ত্রণ এবং এ জাতীয় মত সংরক্ষণের জন্য ম্যাক্রোগুলি ব্যবহার করা বোকামি - তবে বৈধ প্রসঙ্গে যে কেউ কী-স্ট্রোকগুলি সংরক্ষণ করতে এগুলি ব্যবহার করতে পারে না তা সমানভাবে asinine।
আন্ডারস্কোর_২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.