আমাকে একটি সম্পূর্ণ গুরুতর পাল্টা প্রশ্ন জিজ্ঞাসা করি: আপনার দৃষ্টিতে, "ডেটা" এবং "কোড" এর মধ্যে পার্থক্য কী?
যখন আমি "ডেটা" শব্দটি শুনি, তখন আমার মনে হয় "স্থিতি"। সংজ্ঞা অনুসারে ডেটা হ'ল অ্যাপ্লিকেশনটি নিজেই পরিচালনা করার জন্য তৈরি করা জিনিস এবং তাই অ্যাপ্লিকেশনটি সংকলনের সময় কখনই জানতে পারে না। হার্ড-কোড ডেটা সম্ভব নয় , কারণ আপনি এটিকে হার্ড-কোড করার সাথে সাথেই এটি আচরণে পরিণত হয় - ডেটা নয়।
অ্যাপ্লিকেশন অনুসারে ডেটা ধরণের হয়; একটি বাণিজ্যিক চালান ব্যবস্থা গ্রাহক এবং একটি এসকিউএল ডাটাবেসে তথ্য অর্ডার করতে পারে এবং ভেক্টর-গ্রাফিক্স প্রোগ্রাম জ্যামিতি ডেটা এবং মেটাডেটা বাইনারি ফাইলে সঞ্চয় করতে পারে। এই উভয় ক্ষেত্রে এবং এর মধ্যবর্তী সমস্ত কিছুতে কোড এবং ডেটাগুলির মধ্যে একটি স্পষ্ট এবং অবিচ্ছেদ্য বিচ্ছেদ রয়েছে। ডেটা ব্যবহারকারীর অন্তর্ভুক্ত , প্রোগ্রামার নয়, তাই এটি কখনও হার্ড-কোডড হতে পারে না।
আপনি যে বিষয়ে কথা বলছেন বলে মনে হচ্ছে তা হল আমার বর্তমান শব্দভাণ্ডারের জন্য উপলব্ধ সবচেয়ে প্রযুক্তিগতভাবে সঠিক বিবরণটি ব্যবহার করুন: অ্যাপ্লিকেশনটির বেশিরভাগ বিকাশের জন্য ব্যবহৃত প্রাথমিক প্রোগ্রামিং ভাষায় লিখিত নয় এমন তথ্য পরিচালনার প্রোগ্রাম আচরণ।
এমনকি এই সংজ্ঞাটি, যা কেবলমাত্র "ডেটা" শব্দের চেয়ে যথেষ্ট কম অস্পষ্ট, কিছু সমস্যা আছে। উদাহরণস্বরূপ, যদি প্রোগ্রামটির উল্লেখযোগ্য অংশগুলি প্রতিটি আলাদা আলাদা ভাষায় লেখা থাকে? আমি ব্যক্তিগতভাবে প্রায় 50% সি # এবং 50% জাভাস্ক্রিপ্টের বেশ কয়েকটি প্রকল্পে কাজ করেছি। জাভাস্ক্রিপ্ট কোড "ডেটা"? বেশিরভাগ লোক না বলতেন। এইচটিএমএল কি, "তথ্য" কি? বেশিরভাগ লোক এখনও না বলতেন।
সিএসএস সম্পর্কে কী? এটি কি ডেটা বা কোড? যদি আমরা কোডটিকে এমন কিছু বলে মনে করি যা প্রোগ্রামের আচরণকে নিয়ন্ত্রণ করে, তবে CSS আসলে কোড নয়, কারণ এটি কেবল (ভাল, বেশিরভাগ) আচরণকে নয়, চেহারাটিকে প্রভাবিত করে। তবে এটি আসলে ডেটা নয়; ব্যবহারকারীর এটির মালিকানা নেই, অ্যাপ্লিকেশনটির সত্যিকার অর্থে এটিও নেই। এটি কোনও ইউআই ডিজাইনারের কোডের সমতুল্য। এটি কোড- মত , তবে বেশিরভাগ কোড নয়।
আমি সিএসএসকে এক ধরণের কনফিগারেশন বলতে পারি, তবে আরও ব্যবহারিক সংজ্ঞাটি এটি কোনও ডোমেন-নির্দিষ্ট ভাষায় কেবল কোড । আপনার এক্সএমএল, ওয়াইএএমএল এবং অন্যান্য "ফর্ম্যাট করা ফাইল" প্রায়শই প্রতিনিধিত্ব করে। এবং আমরা একটি ডোমেন-নির্দিষ্ট ভাষা ব্যবহার করার কারণটি হ'ল, সাধারণভাবে বলতে গেলে, এটি সি বা সি # বা জাভার মতো কোনও সাধারণ-উদ্দেশ্যমূলক প্রোগ্রামিং ভাষায় একই তথ্য কোডিংয়ের চেয়ে তার নির্দিষ্ট ডোমেনটিতে একই সাথে আরও সংক্ষিপ্ত এবং আরও বেশি ভাবপূর্ণ।
আপনি কি নিম্নলিখিত ফর্ম্যাটটি চিনতে পারেন?
{
name: 'Jane Doe',
age: 27,
interests: ['cats', 'shoes']
}
আমি নিশ্চিত বেশিরভাগ লোকেরা তা করে; এটা JSON । এবং এখানে জেএসএন সম্পর্কে আকর্ষণীয় জিনিসটি: জাভাস্ক্রিপ্টে এটি স্পষ্টভাবে কোড এবং অন্য প্রতিটি ভাষায় এটি স্পষ্টভাবে ফর্ম্যাট করে ডেটা। প্রায় প্রতিটি একক মূলধারার প্রোগ্রামিং ভাষার "পার্সিং" JSON এর জন্য কমপক্ষে একটি গ্রন্থাগার রয়েছে।
আমরা যদি কোনও জাভাস্ক্রিপ্ট ফাইলে কোনও ফাংশনের অভ্যন্তরে সেই একই একই বাক্য গঠন ব্যবহার করি তবে এটি সম্ভবত কোড ব্যতীত অন্য কিছু হতে পারে না। এবং তবুও, আমরা যদি সেই জেএসওএন নিয়ে যাই, এটি কোনও .json
ফাইলে নিক্ষেপ করে , এবং এটি একটি জাভা অ্যাপ্লিকেশনে পার্স করি, হঠাৎ এটি "ডেটা"। আসলেই কি তা বোঝা যায়?
আমি তর্ক করেন যে, "ডেটা-নেস" বা "কনফিগারেশন-অন্তরীপ" বা "কোড-অন্তরীপ" সহজাত হয় কি বর্ণনা করা হচ্ছে, না কিভাবে বর্ণনা হচ্ছে।
যদি আপনার প্রোগ্রামটির জন্য 1 মিলিয়ন শব্দের একটি অভিধানের প্রয়োজন হয়, বলুন, একটি এলোমেলো পাসফ্রেজ তৈরি করুন, আপনি কি এটিকে কোড করতে চান:
var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");
বা আপনি কি এই সমস্ত শব্দকে একটি লাইন-বিস্মৃত পাঠ্য ফাইলের মধ্যে সরিয়ে দিয়ে আপনার প্রোগ্রামটি এটি থেকে পড়তে বলবেন? শব্দের তালিকাটি কখনই পরিবর্তিত হয় না তা আসলে ব্যাপার নয়, আপনি কঠোর কোডিং বা নরম কোডিং (যা অনেকে যথাযথভাবে অনুপযুক্ত প্রয়োগ করার সময় একটি বিরোধী প্যাটার্ন হিসাবে বিবেচনা করে) তা কোনও প্রশ্ন নয়, এটি কেবল একটি প্রশ্ন কোন ফর্ম্যাটটি সবচেয়ে কার্যকর এবং "স্টাফ" যা-ই হোক না কেন, "স্টাফ" বর্ণনা করা সবচেয়ে সহজ করে তোলে। আপনি একে কোড বা ডেটা বলুন তা মোটামুটি অপ্রাসঙ্গিক; আপনার প্রোগ্রামটি চালানোর জন্য এটি প্রয়োজনীয় তথ্য এবং ফ্ল্যাট-ফাইল ফর্ম্যাটটি এটি পরিচালনা ও বজায় রাখার সবচেয়ে সুবিধাজনক উপায়।
ধরে নিচ্ছি যে আপনি যথাযথ অনুশীলনগুলি অনুসরণ করেন, এই সমস্ত জিনিস যে কোনওভাবেই উত্স নিয়ন্ত্রণে চলেছে, সুতরাং আপনি এটিকে কোড হিসাবেও ডাকতে পারেন, কেবল একটি ভিন্ন এবং সম্ভবত খুব সংক্ষিপ্ত আকারে code অথবা আপনি এটিকে কনফিগারেশন বলতে পারেন, তবে কোডটি কনফিগারেশন থেকে সত্যই পৃথক করে এমনটি হ'ল আপনি এটি নথিবদ্ধ করেন এবং কীভাবে এটি পরিবর্তন করবেন তা শেষ ব্যবহারকারীদের জানান। আপনি সম্ভবত কনফিগারেশন শুরুর সময় বা রানটাইম এবং সংকলনের সময় ব্যাখ্যা করার বিষয়ে কিছু জাল যুক্তি উদ্ভাবন করতে পারেন, তবে তারপরে আপনি বেশ কয়েকটি গতিশীল টাইপযুক্ত ভাষা এবং এর ভিতরে এমবেড হওয়া কোনও স্ক্রিপ্টিং ইঞ্জিন সহ প্রায় কোনও কিছুই বর্ণনা করতে শুরু করবেন eg সর্বাধিক গেম) কোড এবং কনফিগারেশন হ'ল আপনি যা হিসাবে লেবেল করার সিদ্ধান্ত নেন তা হ'ল, এর চেয়ে বেশি কিছুই নয়, কিছু কম নয়।
এখন, হয় একটি বিপদ externalizing তথ্য যে আসলে পরিবর্তন করতে নিরাপদ নয় (উপরের "নরম কোডিং" লিঙ্কটি দেখুন)। যদি আপনি কোনও কনফিগারেশন ফাইলে আপনার স্বর অ্যারে বহিরাগত করেন এবং এটি আপনার শেষ ব্যবহারকারীদের কাছে কনফিগারেশন ফাইল হিসাবে নথিভুক্ত করেন তবে আপনি তাত্ক্ষণিকভাবে আপনার অ্যাপ্লিকেশনটি ভেঙে ফেলার জন্য প্রায় বোকা উপায় দিচ্ছেন, উদাহরণস্বরূপ "স্বর" হিসাবে "q" রেখে। তবে "কোড এবং ডেটা পৃথকীকরণ" নিয়ে এটি কোনও মৌলিক সমস্যা নয়, এটি কেবল ডিজাইনের খারাপ ধারণা।
আমি জুনিয়র ডেভসকে যা বলি তা হ'ল তারা সর্বদা সেটিংগুলি বহিরাগত করা উচিত যা তারা প্রতি পরিবেশের পরিবর্তনের প্রত্যাশা করে। এর মধ্যে সংযোগের স্ট্রিং, ব্যবহারকারীর নাম, এপিআই কী, ডিরেক্টরি পাথ এবং আরও কিছু অন্তর্ভুক্ত রয়েছে। আপনার দেব বাক্সে এবং উত্পাদনে এগুলি একই রকম হতে পারে, তবে সম্ভবত তা নয় এবং সিসাদমিনরা সিদ্ধান্ত নেবে যে তারা কীভাবে এটি প্রযোজনায় দেখতে চান, ডেভসকে নয়। সুতরাং আপনার কয়েকটি মেশিনে এক গোষ্ঠী সেটিংস প্রয়োগ করার, এবং অন্যান্য মেশিনগুলিতে অন্যান্য সেটিংস প্রয়োগ করার উপায় প্রয়োজন - এরগো, বাহ্যিক কনফিগারেশন ফাইলগুলি (বা কোনও ডাটাবেসে সেটিংস ইত্যাদি))
তবে আমি জোর দিয়েছি যে কিছু "ডেটা" কোনও "ফাইল" এর মধ্যে রাখা কেবল কনফিগারেশনের মতো বহিরাগত হওয়ার মতো নয়। একটি পাঠ্য ফাইলে শব্দের একটি অভিধান রাখার অর্থ এই নয় যে আপনি ব্যবহারকারীরা (বা আইটি) এটি পরিবর্তন করতে চান, এটি বিকাশকারীদের বোঝার পক্ষে যে এটি কী ঘটছে তা বোঝা সহজতর এবং যদি প্রয়োজন হয় তবে এটি তৈরি করুন মাঝে মাঝে পরিবর্তন। একইভাবে, একই তথ্য একটি ডাটাবেস টেবিলের মধ্যে রাখলে তা অবশ্যই আচরণের বহিরাগতকরণ হিসাবে গণ্য হয় না, যদি সারণীটি কেবলমাত্র পঠনযোগ্য হয় এবং / অথবা ডিবিএকে এটির সাথে কখনও স্ক্রু না দেওয়ার নির্দেশ দেওয়া হয়। কনফিগারেশন সূচিত করে যে ডেটা পরিবর্তনযোগ্য, কিন্তু বাস্তবে যা বিন্যাসের নির্বাচনের পরিবর্তে প্রক্রিয়া এবং দায়িত্ব দ্বারা নির্ধারিত হয়।
সুতরাং, সংক্ষেপে:
"কোড" কোনও কঠোরভাবে সংজ্ঞায়িত শব্দ নয়। আপনি যদি ডোমেন-নির্দিষ্ট ভাষা এবং আচরণকে প্রভাবিত করে এমন অন্য যে কোনও কিছু অন্তর্ভুক্ত করার জন্য আপনার সংজ্ঞাটি প্রসারিত করেন, তবে এই স্পষ্ট ঘর্ষণ খুব সহজেই অদৃশ্য হয়ে যাবে এবং এটি সমস্ত অর্থবোধ করবে। আপনার একটি ফ্ল্যাট ফাইলে নন-সংকলিত, ডিএসএল "কোড" থাকতে পারে।
"ডেটা" এমন তথ্য বোঝায় যা ব্যবহারকারী (গুলি) বা কমপক্ষে বিকাশকারীদের ব্যতীত অন্য কারও মালিকানাধীন এবং নকশাকালীন সময়ে উপলভ্য নয়। আপনি এটি করতে চাইলেও এটি হার্ড-কোডড হতে পারে না। স্ব-সংশোধনকারী কোডের সম্ভাব্য ব্যতিক্রম সহ , কোড এবং ডেটার মধ্যে পৃথকীকরণ সংজ্ঞা হিসাবে বিবেচিত, ব্যক্তিগত পছন্দ নয়।
অতিরিক্ত ব্যবহারের সময় "সফট-কোডিং" একটি ভয়াবহ অনুশীলন হতে পারে তবে বাহ্যিকরণের প্রতিটি উদাহরণ অগত্যা নরম কোডিং গঠন করে না এবং "ফ্ল্যাট ফাইলগুলিতে" তথ্য সংরক্ষণের অনেকগুলি উদাহরণ অগত্যা বাহ্যিকরণে এক জোর প্রচেষ্টা নয়।
কনফিগারেশন নরম-কোডিং যে একটি বিশেষ ধরনের হয় হয় জ্ঞান আবেদন বিভিন্ন পরিবেশের মধ্যে চালানোর জন্য প্রয়োজন হতে পারে যে কারণে প্রয়োজনীয়। অ্যাপ্লিকেশনটির সাথে পৃথক কনফিগারেশন ফাইল স্থাপন করা প্রতিটি পরিবেশে কোডের আলাদা সংস্করণ স্থাপনের চেয়ে কম কাজ (এবং আরও কম বিপজ্জনক)। সুতরাং কিছু ধরণের নরম কোডিং আসলে দরকারী।