এমন কিছু কি না যা পরিশেষে রাষ্ট্রকে হেরফের করে?
হ্যাঁ, তবে যদি এটি কোনও ছোট শ্রেণির সদস্য ফাংশনের পিছনে থাকে যা পুরো সিস্টেমের একমাত্র সত্তা যা তার ব্যক্তিগত রাষ্ট্রকে পরিচালনা করতে পারে, তবে সেই রাষ্ট্রের খুব সংকীর্ণ সুযোগ রয়েছে।
আপনার যতটা সম্ভব সামান্য রাষ্ট্রের সাথে মোকাবিলা করা উচিত?
ভেরিয়েবলের দৃষ্টিকোণ থেকে: কোডের কয়েকটি লাইন যতটা সম্ভব এটি অ্যাক্সেস করতে সক্ষম হওয়া উচিত। ভেরিয়েবলের সুযোগটি সর্বনিম্নে সঙ্কুচিত করুন।
কোডের অবস্থানের দিক থেকে: যতটা সম্ভব ভেরিয়েবলগুলি কোডের সেই লাইন থেকে অ্যাক্সেসযোগ্য হওয়া উচিত। ভেরিয়েবল সংখ্যা সঙ্কীর্ণ যে কোডের লাইন করতে পারেন সম্ভবত অ্যাক্সেস (এটা এমনকি যে কত কোন ব্যাপার না তা নয় এটিকে অ্যাক্সেস যে সব বিষয় কিনা তা করতে পারেন )।
গ্লোবাল ভেরিয়েবলগুলি এত খারাপ কারণ তাদের সর্বাধিক সুযোগ রয়েছে। এমনকি কোডবাইজে কোডের 2 লাইন থেকে কোডের পিওভি-র লাইন থেকে অ্যাক্সেস পাওয়া গেলেও, একটি বৈশ্বিক চলক সর্বদা অ্যাক্সেসযোগ্য। ভেরিয়েবলের পিওওভি থেকে, বহিরাগত লিঙ্কেজ সহ একটি বৈশ্বিক পরিবর্তনশীল পুরো কোডবেজে (বা যাইহোক শিরোনাম অন্তর্ভুক্ত কোডের প্রতিটি লাইন) কোডের প্রতিটি একক লাইনটিতে অ্যাক্সেসযোগ্য। কেবলমাত্র 2 লাইন কোডের মাধ্যমে অ্যাক্সেস করা সত্ত্বেও, বৈশ্বিক চলক যদি 400,000 কোডের লাইনটিতে দৃশ্যমান হয় তবে আপনার সন্দেহযুক্তদের তাত্ক্ষণিক তালিকাটিতে যখন আপনি এটি একটি অবৈধ অবস্থানে সেট করে দেখলেন তখন 400,000 এন্ট্রি থাকবে (সম্ভবত দ্রুত কমিয়ে আনা হবে) সরঞ্জাম সহ 2 টি এন্ট্রি, তবে তবুও, তাত্ক্ষণিক তালিকায় 400,000 সন্দেহভাজন থাকবে এবং এটি উত্সাহজনক সূচনা বিন্দু নয়)।
সম্ভাবনাগুলি একইভাবে, এমনকি যদি কোনও বিশ্বব্যাপী পরিবর্তনশীল পুরো কোডবেজে কেবল দুটি লাইনের কোড দ্বারা সংশোধন শুরু হয়, তবে কোডবেসের পিছনে বিবর্তনের দুর্ভাগ্যজনক প্রবণতাটি সেই সংখ্যায় মারাত্মকভাবে বৃদ্ধি পাবে, কেবল কারণ এটি যতগুলি বাড়তে পারে ডেভলপাররা, নির্ধারিত সময়সীমা পূরণের জন্য উন্মুক্ত, এই গ্লোবাল ভেরিয়েবলটি দেখে এবং বুঝতে পারে যে তারা এর মাধ্যমে শর্টকাট নিতে পারে।
অপরিষ্কার ভাষায় যেমন সি ++ তে, রাজ্য পরিচালনা কি আসলে আপনি করছেন না?
হ্যাঁ, আপনি যদি বহিরাগত উপায়ে সি ++ ব্যবহার না করেন যা আপনি কাস্টম-তৈরি অবিচ্ছেদ্য ডেটা স্ট্রাকচার এবং খাঁটি ফাংশনাল প্রোগ্রামিংয়ের সাথে কাজ করে থাকেন - রাষ্ট্র পরিচালন জটিল হয়ে উঠলে এটি প্রায়শই বেশিরভাগ বাগের উত্স এবং জটিলতা হয় প্রায়শই সেই রাজ্যের দৃশ্যমানতা / এক্সপোজারের একটি কার্য।
এবং পরিবর্তনশীল আজীবন সীমাবদ্ধতা ছাড়া যতটা সম্ভব রাষ্ট্রের সাথে সামঞ্জস্য করার অন্যান্য উপায় কী?
এগুলি সমস্ত একটি ভেরিয়েবলের সুযোগ সীমাবদ্ধ করার ক্ষেত্রের মধ্যে রয়েছে তবে এটি করার অনেকগুলি উপায় রয়েছে:
- প্লেগের মতো কাঁচা বৈশ্বিক পরিবর্তনগুলি এড়িয়ে চলুন। এমনকি কিছু বোবা গ্লোবাল সেটার / গেটর ফাংশন সেই পরিবর্তনশীলটির দৃশ্যমানতাকে তীব্রতরভাবে সঙ্কুচিত করে এবং অন্তত আক্রমণকারীদের বজায় রাখার কিছু উপায়কে মঞ্জুরি দেয় (উদা: বিশ্বব্যাপী চলকটিকে কখনই aণাত্মক মান হিসাবে মঞ্জুরি দেওয়া উচিত না, সেটার সেই আক্রমণকারীটিকে বজায় রাখতে পারে)। অবশ্যই, অন্যথায় কী বৈশ্বিক পরিবর্তনশীল হবে তার উপরে একটি সেটার / গেটর ডিজাইনটি বেশ খারাপ নকশা, আমার বক্তব্যটি এখনও এটি আরও ভাল better
- সম্ভব হলে আপনার ক্লাসগুলি আরও ছোট করুন। শত শ্রেণীর সদস্য ফাংশন, 20 সদস্যের ভেরিয়েবল এবং 30,000 লাইনের কোড প্রয়োগকারী একটি শ্রেণিতে এর পরিবর্তে "গ্লোবাল" বেসরকারী ভেরিয়েবল থাকবে, কারণ এই সমস্ত ভেরিয়েবলগুলি তার সদস্য ফাংশনে অ্যাক্সেসযোগ্য যা কোডের 30k লাইন নিয়ে গঠিত। আপনি সেই ক্ষেত্রে "রাষ্ট্রীয় জটিলতা" বলতে পারেন, তবে প্রতিটি সদস্যের কার্যক্রমে স্থানীয় ভেরিয়েবলকে ছাড় দেওয়া হয়
30,000*20=600,000
। যদি তার উপরে 10 গ্লোবাল ভেরিয়েবলগুলি অ্যাক্সেসযোগ্য হয়, তবে রাষ্ট্র জটিলতা এর মতো হতে পারে 30,000*(20+10)=900,000
। একটি স্বাস্থ্যকর "রাষ্ট্রীয় জটিলতা" (আমার ব্যক্তিগত ধরণের উদ্ভাবিত মেট্রিক) হাজার হাজার বা তার নিচে ক্লাসের জন্য থাকতে হবে, কয়েক হাজার নয়, এবং অবশ্যই কয়েক হাজার নয়। ফ্রি ফাংশনগুলির জন্য, রক্ষণাবেক্ষণের ক্ষেত্রে আমরা গুরুতর মাথাব্যথা পেতে শুরু করার আগে কয়েকশ বা নীচে বলুন।
- উপরের মত একই শিরাতে কোনও সদস্য ফাংশন বা বন্ধু ফাংশন হিসাবে এমন কিছু বাস্তবায়ন করবেন না যা অন্যথায় কেবল শ্রেণীর পাবলিক ইন্টারফেস ব্যবহার করে ননমেম্বার, নন-ফ্রেন্ড হতে পারে। এই জাতীয় ফাংশন শ্রেণীর ব্যক্তিগত ভেরিয়েবলগুলিতে অ্যাক্সেস করতে পারে না এবং এইভাবে সেইসব ব্যক্তিগত ভেরিয়েবলের সুযোগ কমিয়ে ত্রুটির সম্ভাবনা হ্রাস করে।
- ভেরিয়েবলগুলি আসলে কোনও ফাংশনে প্রয়োজনীয় হওয়ার অনেক আগে তার ঘোষনা করা থেকে বিরত থাকুন (অর্থাত্ লিগ্যাসি সি স্টাইলটি এড়িয়ে চলুন যা কোনও ফাংশনের শীর্ষে সমস্ত ভেরিয়েবল ঘোষণা করে এমনকি তাদের নীচে কেবল অনেকগুলি লাইনের প্রয়োজন থাকলেও)। যদি আপনি যাইহোক এই শৈলীটি ব্যবহার করেন তবে কমপক্ষে সংক্ষিপ্ত ফাংশনগুলির জন্য চেষ্টা করুন।
পরিবর্তনশীল ছাড়িয়ে: পার্শ্ব প্রতিক্রিয়া
উপরে উল্লিখিত এই নির্দেশিকাগুলির মধ্যে অনেকগুলি কাঁচা, পরিবর্তনীয় স্থানে (ভেরিয়েবল) সরাসরি অ্যাক্সেসকে মোকাবেলা করছে। তবুও পর্যাপ্ত জটিল কোডবেসে, কেবল কাঁচা ভেরিয়েবলের পরিধি সংকীর্ণ করা খুব সহজেই সঠিকতা সম্পর্কে যুক্তিযুক্ত হতে পারে না।
আপনি বলতে পারেন, একটি সম্পূর্ণ ডাটা স্লাইডের পিছনে একটি কেন্দ্রীয় ডেটা স্ট্রাকচার, বিমূর্ত ইন্টারফেস, আক্রমণকারীদের পুরোপুরি রক্ষণাবেক্ষণের জন্য পুরোপুরি সক্ষম এবং এখনও এই কেন্দ্রীয় রাজ্যের বিস্তৃত এক্সপোজারের কারণে প্রচুর শোকের মধ্যে পড়ে। কেন্দ্রীয় রাজ্যের উদাহরণ যা গ্লোব ইঞ্জিনের কেন্দ্রীয় দৃশ্যের গ্রাফ বা ফটোশপের কেন্দ্রীয় স্তর ডেটা কাঠামোর প্রয়োজনীয়তা বিশ্বব্যাপী অ্যাক্সেসযোগ্য নয় তবে কেবলমাত্র ব্যাপকভাবে অ্যাক্সেসযোগ্য central
এই জাতীয় ক্ষেত্রে, "রাষ্ট্র" ধারণাটি কাঁচা ভেরিয়েবলের বাইরে চলে যায়, এবং কেবল ডেটা স্ট্রাকচার এবং সেই ধরণের জিনিসগুলিতে to এটি একইভাবে তাদের ক্ষেত্র হ্রাস করতে সহায়তা করে (পরোক্ষভাবে তাদের রূপান্তর করতে পারে এমন ফাংশনগুলিকে কল করতে পারে এমন লাইনের সংখ্যা হ্রাস করতে)।
নোট করুন, আমি কীভাবে ইচ্ছাকৃতভাবে এমনকি ইন্টারফেসটিকেও লাল হিসাবে চিহ্নিত করেছি, যেহেতু প্রশস্ত, জুম-আউট আর্কিটেকচারাল স্তর থেকে, সেই ইন্টারফেসটি অ্যাক্সেস করা এখনও অপ্রত্যক্ষভাবেই পরিবর্তিত অবস্থায় রয়েছে state শ্রেণিটি ইন্টারফেসের ফলাফল হিসাবে আক্রমণকারীদের বজায় রাখতে পারে, তবে এটি কেবল আমাদের সঠিকতা সম্পর্কে যুক্তি দেওয়ার দক্ষতার দিক থেকে যায়।
এই ক্ষেত্রে, কেন্দ্রীয় তথ্য কাঠামো একটি বিমূর্ত ইন্টারফেসের পিছনে রয়েছে যা বিশ্বব্যাপী অ্যাক্সেসযোগ্য নাও হতে পারে। এটি কেবল ইনজেকশন দেওয়া হতে পারে এবং তারপরে অপ্রত্যক্ষভাবে আপনার জটিল কোডবেসে ফাংশনগুলির একটি নৌকা বোঝা থেকে (সদস্য ফাংশনের মাধ্যমে) রূপান্তরিত হয়।
এই জাতীয় ক্ষেত্রে, এমনকি যদি ডেটা কাঠামো পুরোপুরি তার নিজস্ব আক্রমণকারীগুলি বজায় রাখে, বিচিত্র জিনিসগুলি বিস্তৃত স্তরে ঘটতে পারে (উদা: একটি অডিও প্লেয়ার সব ধরণের আক্রমণকারীকে বজায় রাখতে পারে যে ভলিউম স্তরটি কখনও 0% থেকে সীমার বাইরে যায় না ১০০%, তবে এটি প্লে বাটনে আঘাতকারী এবং ইভেন্টটি হিসাবে খেলতে শুরু করা এমন একটি ব্যতীত এলোমেলো অডিও ক্লিপটি থেকে এটি রক্ষা করে না যা প্লেলিস্টটিকে বৈধ উপায়ে পরিবর্তন করতে পারে তবে এখনও বিস্তৃত ব্যবহারকারীর দৃষ্টিকোণ থেকে অনাকাঙ্ক্ষিত, চটকদার আচরণ)।
এই জটিল পরিস্থিতিতে নিজেকে রক্ষা করার উপায় হ'ল কোডবেসে থাকা জায়গাগুলিকে "বাধা" দেওয়া যা ফাংশনগুলিকে কল করতে পারে যা শেষ পর্যন্ত এমনকি এই ধরণের সিস্টেমের বিস্তৃত দৃষ্টিকোণ থেকে কাঁচা অবস্থা এবং ইন্টারফেসের বাইরেও বাহ্যিক পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে cause
দেখতে যতটা অদ্ভুত, আপনি দেখতে পাচ্ছেন যে কোনও "রাজ্য" (লাল রঙে দেখানো নয়, এবং এর অর্থ "কাঁচা ভেরিয়েবল" নয়, এর অর্থ একটি "অবজেক্ট" এবং সম্ভবত একটি বিমূর্ত ইন্টারফেসের পিছনেও) অজানা জায়গায় অ্যাক্সেস করা হচ্ছে । প্রতিটি ক্রিয়াকলাপের একটি স্থানীয় রাজ্যে অ্যাক্সেস থাকে যা কেন্দ্রীয় আপডেটেটর দ্বারাও অ্যাক্সেসযোগ্য এবং কেন্দ্রীয় রাষ্ট্রটি কেবলমাত্র কেন্দ্রীয় আপডেটেটারে অ্যাক্সেসযোগ্য (এটিকে আর কেন্দ্রিয় নয় বরং প্রকৃতির স্থানীয়ভাবে তৈরি করে)।
এটি কেবলমাত্র জটিল কোডবেসের জন্য, যেমন একটি গেম যা ১০০ মিলিয়ন লাইন কোড বিস্তৃত হয়, তবে এটি আপনার সফ্টওয়্যারটির সঠিকতা সম্পর্কে যুক্তি করতে এবং আপনার পরিবর্তনগুলি অনুমানযোগ্য ফলাফলের ফলস্বরূপ সাহায্য করতে পারে, যখন আপনি সংখ্যাটি উল্লেখযোগ্যভাবে সীমাবদ্ধ / বাধা দেন finding সমালোচনার পরিবর্তন করতে পারে এমন জায়গাগুলির মধ্যে বলা হয়েছে যে পুরো আর্কিটেকচারটি সঠিকভাবে কাজ করতে চারদিকে ঘোরে।
কাঁচা ভেরিয়েবলের বাইরে বহিরাগত পার্শ্ব প্রতিক্রিয়াগুলি এবং বাহ্যিক পার্শ্ব প্রতিক্রিয়াগুলি ত্রুটি হিসাবে উত্সাহিত করে এমনকি যদি তারা কিছু সদস্য সদস্যের কাজগুলিতে সীমাবদ্ধ থাকে। যদি ফাংশনগুলির একটি বোট লোড সরাসরি সেই মুষ্টিমেয় সদস্যদের ফাংশনগুলিকে কল করতে পারে তবে সিস্টেমে এমন একটি নৌকা বোঝা রয়েছে যা অপ্রত্যক্ষভাবে বাহ্যিক পার্শ্ব প্রতিক্রিয়া সৃষ্টি করতে পারে এবং এটি জটিলতা সৃষ্টি করে। যদি কোডবেসে কেবলমাত্র একটি জায়গা রয়েছে যা সেই সদস্যদের ফাংশনগুলিতে অ্যাক্সেস করে এবং মৃত্যুদণ্ড কার্যকর করার এক পথটি পুরো স্থান জুড়ে ছড়িয়ে ছিটিয়ে থাকা ঘটনা দ্বারা চালিত হয় না, তবে পরিবর্তে খুব নিয়ন্ত্রিত, পূর্বাভাসযোগ্য ফ্যাশনে কার্যকর করা হয়, তবে এটি জটিলতা হ্রাস করে।
রাষ্ট্র জটিলতা
এমনকি রাষ্ট্রের জটিলতাও বিবেচনায় নেওয়া বরং একটি গুরুত্বপূর্ণ কারণ। একটি সাধারণ কাঠামো, বিমূর্ত ইন্টারফেসের পিছনে ব্যাপকভাবে অ্যাক্সেসযোগ্য, গণ্ডগোল করা এতটা কঠিন নয় hard
একটি জটিল গ্রাফ ডেটা স্ট্রাকচার যা একটি জটিল আর্কিটেকচারের মূল যৌক্তিক উপস্থাপনের প্রতিনিধিত্ব করে তা গণ্ডগোল করা খুব সহজ, এবং এমনভাবে যা গ্রাফের আক্রমণকারীদেরও লঙ্ঘন করে না। একটি গ্রাফ একটি সাধারণ কাঠামোর চেয়ে অনেকগুণ জটিল এবং তাই এই ধরনের গ্রাফের কাঠামোটিতে নিখুঁত ন্যূনতম স্থানের অ্যাক্সেস রয়েছে এমন জায়গাগুলির সংখ্যা হ্রাস করার জন্য কোডবেসের অনুভূত জটিলতা হ্রাস করার ক্ষেত্রে এটি আরও জটিল হয়ে ওঠে, এবং যেখানে সেই ধরণের "সেন্ট্রাল আপডেটেটর" কৌশলটি বিক্ষিপ্ত এড়াতে একটি টানা দৃষ্টান্তকে উল্টে দেয়, পুরো জায়গা থেকে সরাসরি গ্রাফের ডেটা স্ট্রাকচারের দিকে সরাসরি ধাক্কা দেয় যা সত্যই পরিশোধ করতে পারে।