এপিআই এবং কার্যকরী প্রোগ্রামিং


15

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

উদাহরণস্বরূপ, বিষয়টি সম্পর্কে এক সাক্ষাত্কারে ক্লোজার খ্যাতি রিচ হিকির আরও বিখ্যাত উক্তিগুলির একটি :

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

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

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

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

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


2
আপনি অবজেক্টের ধারণা ছাড়াই একটি আনুষ্ঠানিক ইন্টারফেস সংজ্ঞায়িত করতে পারেন। তাদের ইন্টারফেসের ডকুমেন্টিংয়ের কাজটি তৈরি করুন। বাস্তবায়নের বিশদগুলির জন্য ডকুমেন্টেশন সরবরাহ করবেন না। আপনি সবেমাত্র একটি ইন্টারফেস তৈরি করেছেন।
Scara95

@ Scara95 এর মানে কি এই নয় যে আমি একটি ইন্টারফেসের জন্য কোডটি প্রয়োগ করতে এবং গ্রাহককে কী করতে হবে এবং কী করবেন না তা সতর্ক করার জন্য এ সম্পর্কে পর্যাপ্ত ডকুমেন্টেশন লিখতে হবে? কোড পরিবর্তন হলে এবং ডকুমেন্টেশনগুলি বাসি হয়ে যায় কি? আমি সাধারণত এই কারণে স্ব-ডকুমেন্টিং কোড পছন্দ করি।
জামেসেল্ক

আপনাকে যেভাবেই ইন্টারফেসটি নথিভুক্ত করতে হবে।
Scara95

3
Also, strictly immutable data seems to make passing around domain-specific structures (objects, structs, records) much less useful in the sense of representing a state and the set of actions that can be performed on that state.আসলে তা না. একমাত্র যেটি পরিবর্তন হয় তা হল পরিবর্তনগুলি একটি নতুন অবজেক্টে শেষ হয়। কোড সম্পর্কে যুক্তি এলেই এটি একটি বিশাল জয় is চারপাশে পরিবর্তনীয় বস্তুগুলি পাস করার অর্থ কে তাদের কে রূপান্তর করতে পারে তার ট্র্যাক রাখা, একটি সমস্যা যা কোডের আকারের সাথে স্কেল করে।
ডোভাল

উত্তর:


10

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

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

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

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

শেষ এবং দীর্ঘতম: এনক্যাপসুলেশন / তথ্য গোপন করা একটি কৌশল , শেষ নয়। এটি কী সরবরাহ করে সে সম্পর্কে কিছুটা চিন্তা করি। এনক্যাপসুলেশন চুক্তি এবং একটি সফ্টওয়্যার ইউনিট বাস্তবায়নের জন্য একটি কৌশল । সাধারণ পরিস্থিতিটি হ'ল: সিস্টেমের বাস্তবায়ন মূল্যবোধকে স্বীকার করে বা বলে যে তার চুক্তি অনুসারে, এর অস্তিত্ব থাকা উচিত নয়।

একবার আপনি এইভাবে এটি দেখুন, আমরা এফপি সরবরাহ করতে পারে তা নির্দেশ করতে পারি, এনপ্যাপুলেশন ছাড়াও, একই প্রান্তে ব্যবহার করা যেতে পারে এমন বেশ কয়েকটি অতিরিক্ত সরঞ্জাম:

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

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


9

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

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

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


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

8

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

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


স্ট্যাটিকালি টাইপ করা, (খাঁটি) কার্যকরী ভাষা সম্পর্কে ওও প্রোগ্রামিংয়ের মতো ডেটাটাইপ সহ কোনও ফাংশন বহন করার কোনও (সহজ) উপায় নেই। ডকুমেন্টেশন ব্যাপার যাইহোক। মুল বক্তব্যটি হ'ল ইন্টারফেসটি সংজ্ঞায়িত করতে আপনার ভাষা সমর্থন দরকার নেই।
Scara95

5
@ Scara95 আপনি কীভাবে "ডেটাটাইপের সাথে একটি ফাংশন বহন করে" বোঝাতে চান তার ব্যাখ্যা দিতে পারেন?
সেবাস্তিয়ান রেডল

6

কিছু কার্যকরী ভাষাগুলি অ্যাবস্ট্রাক্ট ডেটা প্রকার এবং মডিউলগুলিতে প্রয়োগের বিশদটি আটকানো বা আড়াল করার ক্ষমতা দেয় ।

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

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