"কনফিগারেশন ওভার কনফিগারেশন" কি বেসিক প্রোগ্রামিং নীতি লঙ্ঘন করছে না?


51

আমি ডাব্লুপিএফ এমভিভিএম কাঠামো ক্যালিবর্ন.মাইক্রোতে দেখছিলাম এবং পড়েছিলাম যে প্রচুর মানক জিনিস নামকরণের সম্মেলনের উপর ভিত্তি করে ।

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

সম্পাদনা করুন:

সুতরাং এই পদ্ধতির কনফিগারেশন ওভার কনফিগারেশন বলা হয়। যেহেতু আমি এ সম্পর্কিত কোনও প্রশ্ন খুঁজে পাইনি, তাই আমি আমার প্রশ্ন পরিবর্তন করেছি:

আমার প্রশ্নটি হ'ল:

কনফিগারেশন উপর কনভেনশন জিনিস সহজ করার একটি সঠিক উপায়, বা এটি কিছু প্রোগ্রামিং নীতি লঙ্ঘন করছে (এবং যদি তাই হয়, কোনটি)?


8
বেশিরভাগ পদ্ধতির / নীতিগুলি কিছু কিছু ডিগ্রি / নীতিগুলি লঙ্ঘন করে। এটি বেশিরভাগ ক্ষেত্রে অগ্রাধিকার এবং বাণিজ্য-অফের বিষয়।
জোছিম সাউর

1
সত্য, তবে আমি আমার প্রশ্নে বর্ণিত পার্থক্যটি কিছুটা অদ্ভুত বলে মনে করি এবং তাই কনফিগারেশন সম্পর্কিত কনভেনশন ব্যবহার করার সময় আমি নির্দিষ্ট বাণিজ্য বন্ধগুলি এবং সম্ভবত লঙ্ঘিত নীতিগুলিতে আগ্রহী।
গের্টেন

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

উত্তর:


49

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

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

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

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


4
+1: সফটওয়্যার বিকাশ যেমন হয় তেমন জটিল। আপনার নিয়ন্ত্রণে থাকা জিনিসগুলিতে যদি আপনি জটিলতা এড়াতে পারেন তবে তা করুন। আপনার একেবারে প্রয়োজনীয় জায়গাগুলির জন্য জটিলতা সংরক্ষণ করুন।
scrwtp

1
পার্থক্য এবং ভারসাম্য সম্পর্কে পরিষ্কার ব্যাখ্যা জন্য ধন্যবাদ।
গেরটেন

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

4
উদাহরণগুলিকে অত্যুক্তি করবেন না, সেগুলি কেবল উদাহরণ। প্রথমটি একটি কনভেনশনের উদাহরণ, শেষটি একটি উদাহরণ যেখানে কনভেনশন একটি ভাল জিনিস। পার্ল উদাহরণটি এমন একটি উদাহরণ যেখানে খুব বেশি কনভেনশন (জড়িত) একটি খারাপ জিনিস (আইএমও, আমার যুক্ত করা উচিত)।
জেস্পেআর

1
কনফিগারেশন ওভার কনফিগারেশন বিন্যাস ছাড়াই কনভেনশন হয়ে যায় তখন আমি যে জিনিসটিকে ঘৃণা করি তা হ'ল ... পরবর্তী ক্ষেত্রে আপনি কোনও কোডবেসে আটকা পড়ার ঝোঁক রাখেন এটি অন্যান্য সরঞ্জামের সাথে একীভূত করা কঠিন।
অ্যান্ডি

77

@JesperE এ +1 দিয়েছেন এবং কিছু যুক্ত করতে চান:

এটি কি কিছু প্রোগ্রামিং নীতি লঙ্ঘন করছে?

হ্যাঁ, "কনফিগারেশন ওভার কনফিগারেশন" নীতিটি লঙ্ঘন করে "সুস্পষ্টর চেয়ে সুস্পষ্ট ভাল" (উদাহরণস্বরূপ, "জেন-অফ-পাইথন" এ দেখুন )।

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


4
এটাই প্রশ্নের সর্বাধিক প্রত্যক্ষ উত্তর!
জোছিম সউর

এটি সর্বাধিক উত্সাহিত দুটির মধ্যে আসল সঠিক উত্তর।
ডেন

"স্পষ্টকৃতের চেয়ে সুস্পষ্ট" এর জন্য +1
জাস্টিন ওহমস

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

ভাল উত্তর. @ ক্রিস ক্রিচোর মন্তব্যে প্রসারিত করার জন্য, সফ্টওয়্যার স্ট্যান্ডার্ড বা নীতিগুলি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনার পছন্দ করার মতো অনেকগুলি রয়েছে। :-)
user949300

9

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

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

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

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

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


7

অন্য কথায়, অ্যাপ্লিকেশনটির কার্যকারিতা সম্পূর্ণ নিজস্ব কোড দ্বারা ব্যাখ্যা করা হয়নি, তবে কাঠামোর ডকুমেন্টেশন দ্বারাও রয়েছে।

কোনও অ্যাপ্লিকেশনটির কার্যকারিতা যা কোনও কাঠামো ব্যবহার করে তা সর্বদা কাঠামোর উপর নির্ভরশীল, কনফিগারেশন সম্পর্কিত কনভেনশন সে ক্ষেত্রে কোনও তাত্পর্য তোলে না।

আমার অভিজ্ঞতা অনুসারে কনফিগারেশন ওভার কনভেনশনটি কেবল কোডকে আরও পঠনযোগ্য করে তোলে না, তবে এটি সূক্ষ্ম বাগগুলি (বিশেষত অনুলিপি-পেস্ট-বাগ) প্রবর্তনের সম্ভাবনাও হ্রাস করে।

উদাহরণস্বরূপ, আসুন কিছু ফ্রেমওয়ার্ক A তে ধরে নেওয়া যাক, ইভেন্টটি FooBarকলটি ট্রিগার করে handleFooBar। অন্য ফ্রেমওয়ার্ক বিতে, এই পারস্পরিক সম্পর্কটি কোনও এক্সএমএল ফাইলের কোথাও কনফিগার করা হয়েছে।

সুতরাং, এ মধ্যে, এটি সহজ

handleFooBar() {
   ...
}

এবং আপনি FooBar ভুল বানান না করা অবধি, যখনই FooBar ঘটে তখনই এটি ডাকা হবে।

বি তে, এটি আবার

handleFooBar() {
   ...
}

কিন্তু

<eventconfiguration>
  <event>
    <type>FooBar</type>
    <handler>handleFooBar</handler>
  </event>
</eventconfiguration>

এই পদ্ধতিতে কনফিগার করার জন্য শত শত জিনিস সহ, দুর্ঘটনাক্রমে একটি সূক্ষ্ম বাগ তৈরি করা এত সহজ

<eventconfiguration>
  <event>
    <type>BarFoo</type>
    <handler>handleFooBar</handler>
  </event>
</eventconfiguration>

কারণ অনুলিপি-পেস্ট করার পরে, আমরা কেবল পরিবর্তন করেছি <type>তবে পরিবর্তন করতে ভুলে গেছি <handler>

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


1
+1 টি: পুনরাবৃত্তিমূলক, বিরক্তিকর টু লেখ, হার্ড-টু-পড়া, প্রায়-সর্বদা সুস্পষ্ট কনফিগারেশন এড়ানো সম্মেলন ওভার কনফিগারেশনের প্রধান সুবিধা।
জোছিম সৌর

-1

এটি কয়েকটি নীতি লঙ্ঘন করতে পারে তবে একই সময়ে এটি অন্যতম মৌলিক নকশা নীতি, এসআরপি (একক দায়িত্বের নীতি) মেনে চলে।


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