টেনেন্টের চিঠিপত্রের নীতিমালার ভাল ব্যাখ্যা কী?


21

ভাষা নক্সার জন্য এই নীতিটি কী এবং কেন এটি গুরুত্বপূর্ণ তা দেখার জন্য আমি নিজেকে লড়াই করতে দেখেছি।

মূলত, এতে বলা হয়েছে যে exprভাষার প্রতিটি প্রকাশের জন্য এই নির্মাণের মতোই হওয়া উচিত:

(function () { return expr; })()

এছাড়াও, আমি শুনেছি রুবি এই নীতিটি মান্য করে, যদিও পাইথন তা করে না। আমি কেন বুঝতে পারছি না এটি সত্য, বা এটি যদি সত্যিই সত্য হয়।


3
বিষয়টি কেন বন্ধ তা আমি দেখতে পাচ্ছি না, কেউ আমাকে এটি ব্যাখ্যা করতে পারে?
অ্যান্ড্রু

3
একটি দম্পতি ইস্যু আছে; আমি এটি স্পর্শ করেছি এবং এটি প্রোগ্রামারগুলিতে প্রেরণ করছি, যেখানে এর মতো আলোচনা আরও একটু স্বাগত।
ছিড়ে ফেলেছে

1
রুবি এই নীতিটি মানেন না: ধরে নিন exprবর্তমান স্ট্যাক ট্রেস পাবেন।
ল্যান্ডেই

উত্তর:


18

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

তবে এখানে ডগলাস ক্রকফোর্ডের "টিসিপি" (একটি নাম যা আমি জানি এবং বিশ্বাস করি) এর একটি উল্লেখ রয়েছে: http://java.sys-con.com/node/793338/ । আংশিকভাবে

কিছু জিনিস রয়েছে যা সেভাবে আবদ্ধ করা যায় না, যেমন রিটার্ন স্টেটমেন্ট এবং ব্রেক স্টেটমেন্ট, যা টেনেন্টের করসপন্ডেন্স প্রিন্সিপালের (বা টিসিপি) দাবী করা দুর্গন্ধের লক্ষণ। তোকে! ঘ্রাণঘটিত হ্যালুসিনেশনের সাথে লড়াই না করেই ভাষা নকশা ইতিমধ্যে যথেষ্ট কঠিন। সুতরাং সমস্যাটি আরও ভালভাবে বুঝতে, আমি টেনেন্টের 1981 বই, প্রোগ্রামিং ল্যাঙ্গুয়েজসের নীতিমালার একটি কপি কিনেছি।

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

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


1
"গিটারের কল্পনাপ্রসূত এবং সম্ভবত জেনারেলাইজড টিসিপি" এর জন্য +1
jcora

9

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

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


3

ক্লজ রিঙ্ক: টেনেন্টের "শব্দার্থক নীতিগুলির উপর ভিত্তি করে ভাষা নকশা" সম্পর্কিত নীতিগুলির
আকর্ষণীয় ব্যাখ্যা দেয়:
"চিঠিপত্র হ'ল সেই নীতি যা আমাদের বলতে দেয় যে

let(this=obj, x=5) { .. }  

এবং

((function(x) { .. }).call(obj,5))  

সমতুল্য হওয়া উচিত, এবং আনুষ্ঠানিক প্যারামিটার তালিকাগুলিতে আমরা যা কিছু করতে পারি তা আমাদের ঘোষণায়ও করতে সক্ষম হওয়া উচিত এবং এর বিপরীতে "" [নীচে আরও দেখুন, রেইঙ্কে দেখুন]]

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

ক্লজ রিঙ্ক: হাস্কেলের উপর "কার্যকরী প্রোগ্রামিং, ভাষার নকশা এবং অধ্যবসায়"



2

ভাষা নকশার জন্য কেন টেনেন্টের সিপি এত গুরুত্বপূর্ণ, এই প্রশ্নের জবাব দিতে আমি নীল গিফেরার উদ্ধৃতি দিতে চাই :

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

টিসিপির কোনও লঙ্ঘন ভবিষ্যতে কোনও প্রোগ্রামারকে আঘাত করতে পারে যখন তিনি আশা করেন যে ক্লোজারটি নন-ক্লোজার কোডের মতো কাজ করবে তবে তারা আবিষ্কার করে যে টিসিপি লঙ্ঘন করে তারা তা করে না।


1

আর পিথন এই নীতি অনুসরণ করছে না। সাধারণত, এটি নীতি অনুসরণ করে। প্রাথমিক উদাহরণ:

>>> x = ['foo']
>>> x
['foo']
>>> x = (lambda: ['foo'])()
>>> x
['foo']

যাইহোক, পাইথন ভাব এবং বিবৃতি পৃথকভাবে সংজ্ঞায়িত করে । যেহেতু ifশাখা, whileলুপস, ধ্বংসাত্মক কার্যভার এবং অন্যান্য বিবৃতিগুলি lambdaপ্রকাশের ক্ষেত্রে মোটেই ব্যবহার করা যায় না, তাই টেনেন্টের মূলনীতিটি তাদের প্রয়োগ হয় না। তবুও, কেবল পাইথন এক্সপ্রেশন ব্যবহার করে নিজেকে সীমাবদ্ধ করা এখনও একটি টুরিং সম্পূর্ণ সিস্টেম তৈরি করে। সুতরাং আমি এটিকে নীতি লঙ্ঘন হিসাবে দেখছি না; বা বরং, যদি এটি নীতি লঙ্ঘন করে, তবে বিবৃতি এবং মত প্রকাশের পৃথকভাবে সংজ্ঞা দেয় এমন কোনও ভাষা সম্ভবত নীতিটির সাথে সামঞ্জস্য করতে পারে না।

এছাড়াও, যদি lambdaঅভিব্যক্তিটির প্রধান অংশটি একটি স্ট্যাক ট্রেস ক্যাপচার করছিল বা ভিএম-তে অন্য অন্তর্মুখী করছিল যা পার্থক্যের কারণ হতে পারে। তবে আমার মতে এটি লঙ্ঘন হিসাবে গণ্য করা উচিত নয়। যদি exprএবং (lambda: expr)() অগত্যা একই বাইটোকোডে সংকলন করা হয়, তবে নীতিটি সত্যিকারের শব্দার্থবিজ্ঞান নয়, সংকলকদের নিয়ে উদ্বেগ প্রকাশ করে; তবে যদি তারা বিভিন্ন বাইটোকোডে সংকলন করতে পারে তবে আমাদের প্রতিটি ক্ষেত্রে ভিএম রাষ্ট্রটি অভিন্ন হওয়ার আশা করা উচিত নয়।

বোধগম্য বাক্য গঠন ব্যবহার করে একটি আশ্চর্যের মুখোমুখি হতে পারে, যদিও আমি বিশ্বাস করি এটি টেনেন্ট নীতি লঙ্ঘন নয়। উদাহরণ:

>>> [x for x in xrange(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [f() for f in [lambda: x for x in xrange(10)]]  # surprise!
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
>>> # application of Tennent principle to first expression
... [(lambda: x)() for x in xrange(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [f() for f in [(lambda x: lambda: x)(x) for x in xrange(10)]]  # force-rebind x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> map(lambda f:f(), map(lambda x: lambda: x, xrange(10)))  # no issue with this form
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

কীভাবে তালিকা বোধগম্যতা সংজ্ঞায়িত হয় তার ফলাফলটি অবাক করে দেয় surprise উপরের 'আশ্চর্য' বোধগম্যতা এই কোডের সমতুল্য:

>>> result = []
>>> for x in xrange(10):
...   # the same, mutable, variable x is used each time
...   result.append(lambda: x)
... 
>>> r2 = []
>>> for f in result:
...   r2.append(f())
... 
>>> r2
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

এইভাবে দেখা যায়, উপরোক্ত 'আশ্চর্য' বোঝাপড়াটি কম বিস্ময়কর, এবং টেনেন্ট নীতি লঙ্ঘন নয়।

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