পাইথন ফাইলগুলি কনফিগারেশন ফাইল হিসাবে ব্যবহার করা কতটা খারাপ ধারণা?


72

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

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

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

সুতরাং, আমার প্রশ্নটি: আমি যদি স্যুইচ করি তবে আমি কীভাবে নিজেকে পায়ে শুটিং করব?

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

(আমি ইয়ামএএমএল বিবেচনা করেছি , তবে এ সম্পর্কে কিছু আমাকে বিরক্ত করে So তাই, আপাতত আমেরিকান টেবিলটি বন্ধ)


39
দক্ষ না হওয়া আপনার সমস্যা নয়। দূষিত হয়।
ব্লারফ্ল

9
"আমেরিকান টেবিলের বাইরে" বলতে কী বোঝ ?
পিটার মর্টেনসেন

24
"সুতরাং, আপাতত এটি আমেরিকান টেবিলের বাইরে।" === "সুতরাং এখনই আমেরিকার বক্তব্য যেমন টেবিলের বাইরে রয়েছে।"
বিশপ

7
আপনি যদি JSON অপছন্দ করেন, আপনার yaml চেষ্টা করা উচিত। আমি এটি কনফিগার করার জন্য অনেক পছন্দ করি। বিশেষত যখন বৃহত্তর স্ট্রিং জড়িত থাকে, তখন ওয়াইয়ামএল আরও জেএসএএন পাঠযোগ্য।
ক্রিশ্চিয়ান সৌর

5
ইউ কে ইংলিশ ভাষায় @ বিশপ "টেবিলের বাইরে" অর্থ হ'ল আলোচনার সময় হাউস অফ কমন্সের মাঝখানে টেবিলে রাখা সংসদীয় গতি থেকে, 'আলোচনার জন্য উপস্থাপিত' (পার্লামিনেটারিয়ারি রেকর্ড ১ 17৯৯ - book.google.co.uk/… ), মার্কিন যুক্তরাষ্ট্রে আফাইক অর্থ একই, তবে আপনার সংসদে কোনও টেবিল আছে কিনা তা আমি জানি না।
পিট কির্খাম

উত্তর:


92

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

  • এটি একটি প্রোগ্রামিং ভাষা, যা শিখতে হবে। কনফিগারটি সম্পাদনা করতে আপনার এই ভাষাটি যথেষ্ট ভালভাবে জানতে হবে। কনফিগারেশন ফাইলগুলির সাধারণত একটি সহজ ফর্ম্যাট থাকে যা ভুল হওয়া আরও কঠিন।

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

  • এটি একটি প্রোগ্রামিং ভাষা, যা কনফিগারেশন এবং প্রকৃত প্রোগ্রামের মধ্যে স্পষ্ট বিচ্ছিন্নতা বজায় রাখা কঠিন করে তোলে। কখনও কখনও আপনি এই ধরণের এক্সটেনসিবিলিটি চান তবে সেই সময়ে আপনি সম্ভবত একটি বাস্তব প্লাগইন সিস্টেমের সন্ধান করছেন।

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

সুতরাং আপনার সরঞ্জামটির শ্রোতা বিকাশকারীগণ যেমন কনফিগারেশনের জন্য কোনও স্ক্রিপ্ট ব্যবহার করা সম্ভবত ঠিক আছে, যেমন স্পিনিক্স কনফিগারেশন বা পাইথন প্রকল্পগুলিতে সেটআপ.পিপি py এক্সিকিউটেবল কনফিগারেশন সহ অন্যান্য প্রোগ্রামগুলি হ'ল বাশের মতো শেল এবং ভিমের মতো সম্পাদক।

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

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

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


25
বেশ কয়েকটি কনফিগারেশন ফাইল ফর্ম্যাট রয়েছে যা "দুর্ঘটনাক্রমে টিউরিং-সম্পূর্ণ", সবচেয়ে বিখ্যাত sendmail.cf। এটি ইঙ্গিত দেয় যে প্রকৃত স্ক্রিপ্টিং ভাষা ব্যবহার করা উপকারী হতে পারে, যেহেতু সেটিকে প্রকৃতপক্ষে টিউরিং-সম্পূর্ণ করার জন্য তৈরি করা হয়েছিলতবে , টিউরিং-সম্পূর্ণতা এবং "টেট্রিস-সম্পূর্ণতা" দুটি ভিন্ন জিনিস এবং যখন sendmail.cfস্বেচ্ছাসেবী ফাংশনগুলি গণনা করা যায়, এটি আপনাকে নেট থেকে পাঠাতে বা আপনার হার্ডডিস্ক ফর্ম্যাট করতে পারে না/etc/passwd , যা পাইথন বা পার্ল সক্ষম হতে পারে।
Jörg ডব্লু মিটাগ

3
@ জার্গডব্লিউমিটাগ তুরিন-সম্পূর্ণতা নেটওয়ার্কের মাধ্যমে জিনিসগুলি প্রেরণ করতে বা হার্ড ডিস্ক অ্যাক্সেস করতে সক্ষম হতে বোঝায় না। অর্থাৎ, তুরিন-পূর্ণতা I / O সম্পর্কে নয় প্রক্রিয়াজাতকরণ সম্পর্কিত। উদাহরণস্বরূপ সিএসএসকে তুরিন সম্পূর্ণ বলে মনে করা হয় তবে এটি আপনার স্থায়ী সঞ্চয়স্থানে বিঘ্নিত হবে না। আপনি অন্য কোথাও বলেছেন যে "ইদ্রিস একটি সম্পূর্ণ খাঁটি কার্যকরী ভাষা, সুতরাং এটি সংজ্ঞা অনুসারে টুরিং-সম্পূর্ণ নয়", এটি অনুসরণ করে না এবং দৃশ্যত এটি তুরিন সম্পূর্ণ। আমি নিশ্চিত হয়েছি যে আপনার টেস্টিস-সম্পূর্ণ ব্যবহারের অর্থ ভাষাটি তুরিন সম্পূর্ণ ছিল তবে পুরো I / O করতে সক্ষম নয় ... মনে হচ্ছে এটি আপনার অর্থ নয়।
থেরোট

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

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

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

50

Amon এর উত্তরের সমস্ত কিছুতে +1 । আমি এটি যুক্ত করতে চাই:

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

এই কনফিগারেশনটি আমদানি করে এমন সমস্ত কোড আজ পাইথনে লেখা থাকতে পারে এবং আপনিও ভাবতে পারেন যে কালকেও এটি সত্য হবে তবে আপনি কি নিশ্চিতভাবে জানেন?

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

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


1
@ সর্বাধিক, ক্ষমাপ্রার্থী, কিন্তু আমি অনুসরণ করি না। ফাইলটির নাম (এটি .py এ শেষ হয় কি না) এখানে বা সেখানে নেই। আমি যে বক্তব্যটি তৈরির চেষ্টা করছি সেটি হ'ল এটি যদি পাইথনে লেখা থাকে তবে এটি পড়ার জন্য আপনার পাইথন দোভাষী দরকার।
সেলেদা

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

4
@ জোনবেন্টলে আমি মনে করি যে বহু ভাষা প্রকল্প করার পরিকল্পনা থাকলে উদ্বেগটি প্রাসঙ্গিক হবে। আমি ওপি থেকে এই ধারণাটি পাইনি। তদ্ব্যতীত, কনফিগারেশনের জন্য পাঠ্য ফাইলগুলি ব্যবহার করতে এখনও মানগুলির প্রকৃত বিশ্লেষণ / রূপান্তরকরণের জন্য অতিরিক্ত কোড (সমস্ত ভাষায়) প্রয়োজন। প্রযুক্তিগতভাবে, যদি তারা পাইথন পার্শ্বটি key=valueকনফিগারেশনের জন্য অ্যাসাইনমেন্টের মধ্যে সীমাবদ্ধ করে রাখে তবে আমি দেখতে পাচ্ছি না যে কোনও জাভা / সি ++ প্রোগ্রাম কেন পাইথন ফাইলটিকে একটি সরল পাঠ্য ফাইল হিসাবে পড়তে পারে না এবং যদি অন্য কোনও জায়গায় যাওয়ার প্রয়োজন হয় তবে এটি একইভাবে পার্স করতে পারে ভবিষ্যৎ. আমি একটি পূর্ণাঙ্গ পাইথন ইন্টারপ্রেটারের প্রয়োজন দেখছি না।
কোড_ড্রেড

3
@ray সত্য, তবে উত্তরটি এখনও সেই ভিত্তিতে কার্যকর যে প্রশ্নগুলি কেবল যে ব্যক্তি তাদের পোস্ট করে তাদের ক্ষেত্রে প্রযোজ্য হবে না। যদি আপনি একটি প্রমিত বিন্যাস (যেমন INI, JSON, YAML, XML ইত্যাদি) ব্যবহার করেন তবে আপনি সম্ভবত নিজের লেখার পরিবর্তে একটি বিদ্যমান পার্সিং লাইব্রেরি ব্যবহার করবেন। পার্সিং লাইব্রেরিটির সাথে ইন্টারফেস করতে এটি কেবলমাত্র একটি অ্যাডাপ্টারের শ্রেণিতে অতিরিক্ত কাজ হ্রাস করে। যদি আপনি নিজেকে কী = মানের মধ্যে সীমাবদ্ধ করে থাকেন তবে এটি প্রথমে পাইথন ব্যবহার করার জন্য ওপি'র বেশিরভাগ কারণকে সরিয়ে দেয় এবং আপনি কেবল একটি স্বীকৃত ফর্ম্যাট দিয়ে যেতে পারেন।
জন বেন্টলে

3
কয়েক বছর আগে আমাকে এটি করতে হয়েছিল যখন লুয়ায় লেখা একটি সরঞ্জাম লুয়া স্ক্রিপ্টটিকে তার কনফিগার হিসাবে ব্যবহার করেছিল, তখন তারা আমাদের সি-তে একটি নতুন সরঞ্জাম লিখতে চেয়েছিল এবং বিশেষত লুয়া কনফিগার স্ক্রিপ্টটি ব্যবহার করতে বলেছিল। তাদের মোট 2 টি লাইন ছিল যা আসলে প্রোগ্রামযোগ্য এবং সাধারণ x = y নয়, তবে এখনও তাদের জন্য। নেট এর জন্য ওপেন সোর্স লুয়া ইন্টারপ্রেটারদের সম্পর্কে শিখতে হয়েছিল। এটি খাঁটি তাত্ত্বিক যুক্তি নয়।
কেভিন ফি

21

অন্যান্য উত্তরগুলি ইতিমধ্যে খুব ভাল, আমি কয়েকটি প্রকল্পে আমার বাস্তব-বিশ্বের ব্যবহারের অভিজ্ঞতাটি নিয়ে আসছি।

পেশাদাররা

এগুলি বেশিরভাগই ইতিমধ্যে বানানযুক্ত:

  • আপনি যদি পাইথন প্রোগ্রামে থাকেন তবে পার্সিং হ'ল বাতাস ( eval); এটা এমনকি আরো জটিল ধরনের তথ্য জন্য স্বয়ংক্রিয়ভাবে কাজ করে (আমাদের প্রোগ্রাম, আমরা জ্যামিতিক পয়েন্ট এবং রূপান্তরের, যা ডাম্প / মাধ্যমে ঠিক সূক্ষ্ম লোড করা হয় আছে repr/ eval);
  • কয়েকটি লাইন কোডের সাথে একটি "জাল কনফিগারেশন" তৈরি করা তুচ্ছ;
  • আপনার কাছে আরও ভাল কাঠামো রয়েছে এবং আইএমও, জেএসএনের চেয়ে আরও ভাল সিনট্যাক্স রয়েছে (জিজ এমনকি মন্তব্যও করেছেন এবং অভিধান কীগুলির ডাবল কোট না লাগানো একটি বড় পঠনযোগ্যতা জয়)।

কনস

  • দূষিত ব্যবহারকারীরা আপনার মূল প্রোগ্রামটি যে কিছু করতে পারে তা করতে পারে; আমি এই সমস্যার অনেক কিছুই বিবেচনা করি না, যেহেতু সাধারণত যদি ব্যবহারকারী কোনও কনফিগারেশন ফাইল পরিবর্তন করতে পারেন তবে সে ইতিমধ্যে অ্যাপ্লিকেশন যা করতে পারে তা করতে পারে;
  • আপনি যদি পাইথন প্রোগ্রামে আর না থাকেন, এখন আপনার সমস্যা আছে। যদিও আমাদের বেশ কয়েকটি কনফিগারেশন ফাইলগুলি তাদের মূল অ্যাপ্লিকেশনে ব্যক্তিগত ছিল, বিশেষত একটি তথ্য বিভিন্ন তথ্য যা বিভিন্ন প্রোগ্রাম দ্বারা ব্যবহৃত হয় তা সংরক্ষণ করতে আসে, যার বেশিরভাগটি বর্তমানে সি ++ এ রয়েছে, যা এখন একটি অশুভ-সংজ্ঞায়িত ছোটর জন্য হ্যাক-একসাথে পার্সার রয়েছে পাইথনের উপসেট repr। এটি অবশ্যই খারাপ জিনিস।
  • এমনকি যদি আপনার প্রোগ্রামটি পাইথনে থেকে যায় তবে আপনি পাইথন সংস্করণ পরিবর্তন করতে পারেন। ধরা যাক পাইথন 2 এ আপনার অ্যাপ্লিকেশন শুরু হয়েছিল; প্রচুর পরীক্ষার পরেও আপনি এটিকে পাইথন 3 এ স্থানান্তরিত করতে পেরেছেন - দুর্ভাগ্যক্রমে, আপনি আপনার সমস্ত কোড সত্যই পরীক্ষা করেননি - আপনার গ্রাহকদের মেশিনে পাইথন 2 এর জন্য লেখা সমস্ত কনফিগারেশন ফাইল রয়েছে এবং যার উপরে আপনি ডোন করেন না সত্যিই নিয়ন্ত্রণ নেই। আপনি পুরানো কনফিগারেশন ফাইলগুলি পড়ার জন্য "সামঞ্জস্যতা মোড" সরবরাহ করতে পারবেন না (যা প্রায়শই ফাইল ফর্ম্যাটগুলির জন্য করা হয়), যদি না আপনি পাইথন 2 ইন্টারপ্রেটারকে বান্ডেল / কল করতে রাজি না হন!
  • আপনি পাইথনে থাকলেও কোড থেকে কনফিগারেশন ফাইলটি পরিবর্তন করা একটি আসল সমস্যা, কারণ ... ভাল, কোড পরিবর্তন করা মোটেই তুচ্ছ নয়, বিশেষত এমন কোড যা সমৃদ্ধ বাক্য গঠন এবং এলআইএসপি বা অনুরূপ নয়। আমাদের একটি প্রোগ্রামে একটি কনফিগারেশন ফাইল রয়েছে যা পাইথন, মূলত হাতে লেখা, কিন্তু যা পরে প্রমাণিত হয়েছিল এটি সফ্টওয়্যারটির মাধ্যমে কারসাজি করা কার্যকর হবে (একটি নির্দিষ্ট সেটিংস এমন জিনিসের একটি তালিকা যা জিইউআই ব্যবহার করে পুনঃক্রম করতে সহজতর উপায় )। এটি একটি বড় সমস্যা, কারণ:

    • এমনকি কেবল একটি পার্স → এএসটি → পুনর্লিখনের রাউন্ডট্রিপ সম্পাদন করা তুচ্ছ নয় (আপনি লক্ষ্য করবেন যে প্রস্তাবিত সমাধানগুলির অর্ধেকটি পরে "" অপ্রচলিত, ব্যবহার করবেন না, সমস্ত ক্ষেত্রে কাজ করে না "হিসাবে চিহ্নিত হয়েছে));
    • এমনকি যদি তারা কাজ করে তবে এএসটি খুব নীচের স্তরের; আপনি সাধারণত ফাইলটিতে সম্পাদিত গণনাগুলির ফলাফলের কৌশলগতভাবে আগ্রহী , এটিতে আনীত পদক্ষেপগুলি নয়;
    • যা আমাদের সাধারণ সত্যটিতে নিয়ে আসে যে আপনি যে মানগুলি আগ্রহী সেগুলি সম্পাদন করতে পারবেন না, কারণ এগুলি কিছু জটিল সংখ্যার দ্বারা উত্পাদিত হতে পারে যা আপনি আপনার কোডের মাধ্যমে বুঝতে / পরিচালনা করতে পারবেন না।

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


সুতরাং, যথারীতি, কোনও পরিষ্কার সমাধান নেই; ইস্যুতে আমার বর্তমান নীতি হ'ল:

  • যদি কনফিগারেশন ফাইলটি হয়:

    • অবশ্যই এটি একটি পাইথন অ্যাপ্লিকেশন এবং এটি ব্যক্তিগত - যেমন অন্য কেউ এর থেকে পড়ার চেষ্টা করবে না;
    • হাতে লেখা;
    • একটি বিশ্বস্ত উত্স থেকে আসা;
    • টার্গেট অ্যাপ্লিকেশন ডেটা ধরণের ব্যবহার সত্যিই একটি প্রিমিয়াম;

    পাইথন ফাইলটি একটি বৈধ ধারণা হতে পারে;

  • পরিবর্তে যদি:

    • এটি থেকে অন্য কিছু অ্যাপ্লিকেশন পড়ার সম্ভাবনা থাকতে পারে;
    • এই ফাইলটি কোনও অ্যাপ্লিকেশন দ্বারা সম্পাদিত হতে পারে এমন সম্ভাবনা রয়েছে, সম্ভবত আমার অ্যাপ্লিকেশনটি নিজেই;
    • একটি অবিশ্বস্ত উত্স দ্বারা সরবরাহ করা হয়।

    একটি "কেবলমাত্র ডেটা" ফর্ম্যাটটি আরও ভাল ধারণা হতে পারে।

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


1
কনফিগার তৈরি বা পুনর্লিখন সম্পর্কে খুব ভাল পয়েন্ট! তবে এক্সএমএল ব্যতীত কয়েকটি ফরম্যাটগুলি আউটপুটে মন্তব্য ধরে রাখতে পারে, যা আমি কনফিগারেশনের জন্য অত্যন্ত গুরুত্বপূর্ণ বলে মনে করি। অন্যান্য ফর্ম্যাটগুলি মাঝে মধ্যে এমন একটি note:ক্ষেত্র প্রবর্তন করে যা কনফিগারেশনের জন্য উপেক্ষা করা হয়।
আমন

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

2
@ দিমিত্রিগ্রিরিভ: আপনি যদি সেই লক্ষ্যের দিকে লক্ষ্য রাখছেন তবে আপনি আপনার শিকারকে কিছু কপি-পেস্ট করতে বলতে পারেন curl ... | bash, এটি কোনও ঝামেলাও কম নয়। :
মাত্তেও ইটালিয়া

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

1
@ দিমিত্রিগ্রিরিভ: আমার বক্তব্যটি হ'ল যদি আপনার শিকারের ধরণটি কোনও কনফিগারেশন ফাইলকে অন্ধভাবে অনুলিপি করে অনুলিপি করতে পারে তবে আপনি সম্ভবত তার মেশিনে কিছুটা তির্যক পদ্ধতিতে যা করতে তা চালিত করতে পারেন ("এটিকে কোনও কনসোলে পেস্ট করুন" আপনার সমস্যা সমাধান করুন! ")। এছাড়াও, কার্যকর না করার যোগ্য কনফিগারেশন ফাইলগুলির সাথেও ক্ষতির সম্ভাবনা রয়েছে - এমনকি ক্ষতিকারকভাবে সমালোচনামূলক ফাইলগুলির মধ্যে লগিংয়ের ইঙ্গিত করা (যদি অ্যাপ্লিকেশনটি যথেষ্ট সুযোগ-সুবিধা দিয়ে চালিত হয়) তবে আপনি সিস্টেমে সর্বনাশ ডেকে আনতে পারেন। সেই কারনেই কেন আমি মনে করি যে বাস্তবে এটা না অনেক নিরাপত্তা পরিপ্রেক্ষিতে একটি পার্থক্য।
মাত্তেও ইটালিয়া

8

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

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

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

(আপনি যদি গতিশীলভাবে গণনা করা কনফিগারেশন গ্রহণ করেন তবে আপনাকে সুরক্ষার সমস্যাগুলি সম্পর্কে আপনার ব্যবহারকারীর উপর আস্থা রাখতে হবে)

সুতরাং আপনার প্রারম্ভিককরণের কোডটিতে আপনার main(উদাহরণস্বরূপ) কিছু --config যুক্তি স্বীকার করা হবে confargএবং এ FILE*configf;থেকে কিছু পাবেন । যদি সেই যুক্তিটি !(যেমন যদি (confarg[0]=='!')....) দিয়ে শুরু হয় , আপনি configf = popen(confarg+1, "r");সেই পাইপটি ব্যবহার এবং বন্ধ করে দিতেন pclose(configf);। অন্যথায় আপনি configf=fopen(confarg, "r");সেই ফাইলটি ব্যবহার এবং বন্ধ করে দিতেন fclose(configf);(ত্রুটি পরীক্ষা করার বিষয়টি ভুলে যাবেন না)। দেখুন নল (7) , popen (3) , হয় fopen (3) । পাইথনে কোডেড একটি অ্যাপ্লিকেশনটির জন্য ওএসপেন ইত্যাদি পড়ুন ...

(দস্তাবেজে নামে একজন কনফিগারেশন ফাইল পাস অনুপস্থিত অদ্ভুত ব্যবহারকারীর জন্য !foo.configপাস ./!foo.configবাইপাস করার popenউপরে কৌতুক)

বিটিডাব্লু, এই জাতীয় কৌশলটি কেবল একটি সুবিধা (উন্নত ব্যবহারকারীকে উদাহরণ হিসাবে একটি কনফিগারেশন ফাইল উত্পন্ন করার জন্য কিছু শেল স্ক্রিপ্ট কোড করা প্রয়োজন )। যদি ব্যবহারকারী কোনও বাগ রিপোর্ট করতে চান তবে তার উচিত আপনার উত্পন্ন কনফিগারেশন ফাইলটি ...

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

পাইথনের মতো স্ক্রিপ্টিং ভাষায় কোডেড একটি অ্যাপ্লিকেশনের জন্য আপনি কিছু প্রোগ্রাম আর্গুমেন্টও গ্রহণ করতে পারেন eval বা exec বা অনুরূপ আদিমতার জন্য pr আবার, সুরক্ষার সমস্যাগুলি তখন (উন্নত) ব্যবহারকারীর উদ্বেগ

আপনার কনফিগারেশন ফাইলটির পাঠ্য বিন্যাস (এটি উত্পন্ন বা না হওয়া) সম্পর্কে, আমি বিশ্বাস করি যে আপনার বেশিরভাগই এটি ভালভাবে নথিভুক্ত করা প্রয়োজন (এবং কোনও নির্দিষ্ট বিন্যাসের পছন্দটি তেমন গুরুত্বপূর্ণ নয়; তবে আমি আপনাকে আপনার ব্যবহারকারীকে রাখতে সক্ষম হতে পরামর্শ দিচ্ছি) কিছু-বাদ দেওয়া- এর ভিতরে মন্তব্যগুলি)। আপনি JSON ব্যবহার করতে পারে (বিশেষ কিছু JSON বিশ্লেষক গ্রহণ এবং চলিত সঙ্গে মন্তব্য কুঁদন সঙ্গে //eol বা পর্যন্ত /*... */...), অথবা YAML, অথবা XML, অথবা INI এ বা আপনার নিজের জিনিস। একটি কনফিগারেশন ফাইল পার্স করা যুক্তিসঙ্গতভাবে সহজ (এবং আপনি সেই কাজের সাথে সম্পর্কিত অনেকগুলি লাইব্রেরি পাবেন)।


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

2

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

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


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

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

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

1
@ পেটকিরখাম, অন্যভাবে প্রায় সমস্যা সম্ভবত এটিই সম্ভবত। উইন্ডোজ আপনার কাছে বিস্ফোরণ ঘটায় এমন এক অনিচ্ছাকৃত ক্রেপ থাকে। পাইথন ভাল ডকুমেন্টেড এবং সোজা হয়ে থাকে। এটি বলেছিল, আপনার যা দরকার তা হল সরল কী / মান জোড় ( সম্ভবত বিভাগগুলি সহ), এটি বেশ ভাল পছন্দ। আমি সন্দেহ করি এটি 90% ব্যবহারের ক্ষেত্রে কভার করে। .NET এর কনফিগারেশন ফাইলগুলি যদি রীতিমতো XML এর পরিবর্তে স্কিমা সহ কোডটি থাকে যা কনফিগারেশনের জন্য কোডটি মাস্ক্রেড করে থাকে তবে আমরা আরও অনেক ভাল হতে চাই।
jpmc26

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

1

টিসিএল-তে এর কনফিগারেশন ফাইলগুলি লেখা আছে এমন কিছু নামী সফ্টওয়্যার নিয়ে আমি দীর্ঘ সময় ধরে কাজ করেছি , সুতরাং ধারণাটি নতুন নয়। এটি বেশ ভালভাবে কাজ করেছে, যেহেতু ব্যবহারকারীরা যারা ভাষা জানেন না তারা এখনও একটি একক set name valueবিবৃতি ব্যবহার করে সাধারণ কনফিগারেশন ফাইলগুলি লিখতে / সম্পাদনা করতে পারবেন , যখন আরও উন্নত ব্যবহারকারী এবং বিকাশকারীরা এটির সাথে অত্যাধুনিক কৌশলগুলি টানতে পারে।

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

কনফিগারটি পুনরায় লেখাই সমস্যা, যদিও এটি মনে হয় ততটা খারাপ নয় not স্বেচ্ছাসেবক কোড আপডেট করা অসম্ভব, তবে কোনও ফাইল থেকে কনফিগার লোড করা, এটিকে পরিবর্তন করা এবং এটিকে আবার সংরক্ষণ করা। মূলত, আপনি যদি কোনও কনফিগারেশনের মধ্যে কিছু স্ক্রিপ্টিং করেন যা কেবল পঠনযোগ্য নয়, আপনি কেবলমাত্র set name valueবিবৃতিগুলির সমপরিমাণ তালিকাটি সংরক্ষণ করার পরে শেষ করবেন। এটির একটি ভাল ইঙ্গিতটি হ'ল ফাইলটির শুরুতে একটি "সম্পাদনা করবেন না" মন্তব্য।

একটি বিষয় বিবেচনা করার বিষয় হ'ল আপনার কনফিগারেশন ফাইলগুলি সহজ রেগেক্স-ভিত্তিক সরঞ্জামগুলির দ্বারা নির্ভরযোগ্যভাবে পাঠযোগ্য হবে না sed, তবে যতদূর আমি বুঝতে পেরেছি এটি আপনার বর্তমান জেএসওএন ফাইলগুলির ক্ষেত্রে ইতিমধ্যে নয়, তাই হারাতে খুব বেশি কিছু নেই।

আপনার কনফিগার ফাইলগুলি সম্পাদন করার সময় আপনি উপযুক্ত স্যান্ডবক্সিং কৌশল ব্যবহার করেছেন তা নিশ্চিত করুন ।


1
"সফ্টওয়্যার" একটি আনসাউন্টযোগ্য বিশেষ্য, সুতরাং এটি " কিছু সুপরিচিত সফ্টওয়্যার " হওয়া উচিত ।
jpmc26

1

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

  1. পাইথন উত্স ফাইলে থাকা সেটিংস প্রযুক্তিগতভাবে কেবলমাত্র পঠনযোগ্য ডেটা ফাইলের চেয়ে এক্সিকিউটেবল উত্স কোডের অংশ। আপনি যদি এই রুটে যান তবে আপনি সাধারণত তা করতেন import configকারণ এই ধরণের "সুবিধার্থে" সম্ভবত পাইথন ফাইলটি কনফিগার হিসাবে প্রথমে ব্যবহারের মাধ্যমে লোকেদের শুরু করার অন্যতম প্রধান কারণ ছিল। এখন আপনি আপনার রেপোতে সেই কনফিগারেশন.ইপি প্রতিশ্রুতিবদ্ধ হন, অন্যথায় আপনার ব্যবহারকারী যখন প্রথমবার আপনার প্রোগ্রামটি চালানোর চেষ্টা করবেন তখন আপনার শেষ ব্যবহারকারী একটি বিভ্রান্তিকর ImportError এর মুখোমুখি হবেন।

  2. ধরে নিচ্ছি যে আপনি আসলে আপনার রেপোতে সেই কনফিগারেশনটি করছেন now এখন আপনার দলের সদস্যদের বিভিন্ন পরিবেশে সম্ভবত বিভিন্ন সেটিংস থাকতে পারে। কোনও দিন কল্পনা করুন যে কোনওরকম সদস্য দুর্ঘটনাক্রমে তার স্থানীয় কনফিগারেশন ফাইলটি রেপোতে সরিয়ে দেয়।

  3. সর্বশেষে তবে অন্তত নয়, আপনার প্রকল্পের কনফিগারেশন ফাইলে পাসওয়ার্ড থাকতে পারে। (এটি নিজস্বভাবে একটি বিতর্কযোগ্য অনুশীলন, তবে এটি যাইহোক ঘটে)) এবং যদি আপনার কনফিগারেশন ফাইলটি রেপোতে উপস্থিত থাকে, আপনি আপনার পাবলিক রেপোতে আপনার শংসাপত্রের প্রতিশ্রুতিবদ্ধ হওয়ার ঝুঁকি নিয়ে থাকেন।

এখন, সর্বজনীন JSON ফর্ম্যাটের মতো একটি ডেটা-কনফিগারেশন ফাইল ব্যবহার করে উপরের সমস্ত 3 টি সমস্যা এড়ানো যেতে পারে, কারণ আপনি ব্যবহারকারীকে যুক্তিসঙ্গতভাবে তাদের নিজস্ব কনফিগারেশন.জসন নিয়ে আসতে এবং এটি আপনার প্রোগ্রামে খাওয়ানোর জন্য বলতে পারেন।

পিএস: এটি সত্য যে জেএসএনের অনেকগুলি বাধা আছে। ওপি দ্বারা উল্লিখিত সীমাবদ্ধতার 2 টি কিছু সৃজনশীলতার দ্বারা সমাধান করা যেতে পারে।

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