প্রসিডুয়াল / ফাংশনাল প্রোগ্রামিং কোনওভাবেই ওওপি থেকে দুর্বল নয় এমনকি টুরিং আর্গুমেন্টে না গিয়েও (আমার ভাষায় টুরিংয়ের ক্ষমতা রয়েছে এবং অন্য যে কোনও কাজ করতে পারে) যার অর্থ খুব বেশি নয়। আসলে, অবজেক্ট ওরিয়েন্টেড কৌশলগুলি প্রথমে এমন ভাষাগুলিতে পরীক্ষা করা হয়েছিল যেগুলি অন্তর্নির্মিত ছিল না। এই অর্থে ওও প্রোগ্রামিং প্রক্রিয়াজাত প্রোগ্রামিংয়ের একটি নির্দিষ্ট স্টাইল । তবে এটি প্রোগ্রামের বোধগম্যতা এবং রক্ষণাবেক্ষণের জন্য প্রয়োজনীয় শৃঙ্খলা, বিমূর্ততা এবং তথ্য গোপনের মতো নির্দিষ্ট শৃঙ্খলা প্রয়োগে সহায়তা করে ।
কিছু প্রোগ্রামিং দৃষ্টান্ত গণনার তাত্ত্বিক দৃষ্টি থেকে বিকশিত হয়। লিস্পের মতো একটি ভাষা ল্যাম্বডা-ক্যালকুলাস থেকে বিকশিত হয়েছিল এবং ভাষাগুলির মেটা-বৃত্তাকার ধারণা (প্রাকৃতিক ভাষায় প্রতিবিম্বের অনুরূপ)। হর্ন ক্লজগুলি প্রোলগ এবং সীমাবদ্ধ প্রোগ্রামিংয়ের জন্ম দেয়। আলগোল পরিবারও ল্যাম্বডা-ক্যালকুলাসের কাছে ণী, তবে বিল্ট-ইন রিফ্লেক্সিভিটি ছাড়াই।
লিস্প একটি আকর্ষণীয় উদাহরণ, কারণ এটি প্রচুর প্রোগ্রামিং ভাষার উদ্ভাবনের টেস্টবেড হয়েছে, এটি তার দ্বৈত জিনগত heritageতিহ্যের সন্ধান করতে পারে।
তবে ভাষাগুলি প্রায়শই নতুন নামে বিবর্তিত হয়। বিবর্তনের একটি প্রধান কারণ প্রোগ্রামিং অনুশীলন। ব্যবহারকারীরা প্রোগ্রামিং অনুশীলনগুলি শনাক্ত করে যা পাঠযোগ্যতা, রক্ষণাবেক্ষণযোগ্যতা, নির্ভুলতার সম্ভাবনা ইত্যাদির মতো প্রোগ্রামগুলির বৈশিষ্ট্যগুলিকে উন্নত করে। তারপরে তারা ভাষাগুলির বৈশিষ্ট্য বা প্রতিবন্ধকতাগুলিকে যুক্ত করার চেষ্টা করেন যা সমর্থন করবে এবং কখনও কখনও এই অনুশীলনগুলি প্রয়োগ করে যাতে প্রোগ্রামগুলির মানের উন্নতি করতে পারে।
এর অর্থ হ'ল এই অনুশীলনগুলি পুরানো প্রোগ্রামিং ভাষায় ইতিমধ্যে সম্ভব, তবে সেগুলি ব্যবহার করতে বোঝার এবং শৃঙ্খলার দরকার। তাদের নির্দিষ্ট ভাষায় প্রাথমিক ধারণা হিসাবে নতুন ভাষায় অন্তর্ভুক্ত করা এই পদ্ধতিগুলি বিশেষত কম পরিশীলিত ব্যবহারকারীদের (যেমন, বিশাল সংখ্যাগরিষ্ঠ) জন্য ব্যবহার করা এবং সহজেই বুঝতে সহজ করে তোলে। এটি পরিশীলিত ব্যবহারকারীদের জন্য জীবনকে কিছুটা সহজ করে তোলে।
কোনও উপায়ে, কোনও প্রোগ্রামের জন্য একটি উপ-প্রোগ্রাম / ফাংশন / পদ্ধতি কী তা ভাষা নকশা করা উচিত। একবার কার্যকর ধারণাটি সনাক্ত করা গেলে, এটি একটি নাম (সম্ভবত) এবং একটি বাক্য গঠন দেওয়া হয়, যাতে এটি সেই ভাষার সাথে বিকশিত সমস্ত প্রোগ্রামে সহজেই ব্যবহার করা যায়। এবং সফল হলে এটি ভবিষ্যতের ভাষাগুলিতেও সংযুক্ত করা হবে।
উদাহরণ: পুনরুক্তি করা অবজেক্ট অরিয়েন্টেশন
আমি এখন এটি একটি উদাহরণে বোঝানোর চেষ্টা করি (যা অবশ্যই আরও নির্দিষ্ট করে দেওয়া যেতে পারে, সময় দেওয়া হয়েছে)। উদাহরণের উদ্দেশ্যটি দেখানো নয় যে কোনও অবজেক্ট অরিয়েন্টেড প্রোগ্রামটি সম্ভবত প্রবণতা এবং রক্ষণাবেক্ষণের ব্যয়ে প্রক্রিয়াগত প্রোগ্রামিং স্টাইলে লেখা যেতে পারে। আমি বরং এটি দেখানোর চেষ্টা করব যে ওও সুবিধাগুলি ব্যতীত কিছু ভাষা প্রকৃতপক্ষে কার্যকরভাবে অবজেক্ট ওরিয়েন্টেশন অনুকরণের উপায় তৈরি করতে উচ্চতর অর্ডার ফাংশন এবং ডেটা স্ট্রাকচার ব্যবহার করতে পারে , যাতে মডুলারিটি, বিমূর্তি এবং তথ্য গোপন সহ প্রোগ্রাম সংস্থার বৈশিষ্ট্যগুলি থেকে উপকার পেতে পারে ।
যেমনটি আমি বলেছিলাম, লিস্প হ'ল ওও দৃষ্টান্ত সহ অনেক ভাষার বিবর্তনের পরীক্ষা-নিরীক্ষা (যদিও প্রথম ওও ভাষা হিসাবে বিবেচিত হতে পারে এটি সিমুলা 67 67, আলগোল পরিবারে)। লিস্প খুব সহজ, এবং এর প্রাথমিক দোভাষীটির কোডটি একটি পৃষ্ঠার চেয়ে কম। তবে আপনি লিস্পে ওও প্রোগ্রামিং করতে পারেন। আপনার যা দরকার তা হ'ল উচ্চতর অর্ডার ফাংশন।
উপস্থাপনাটি সহজ করার জন্য আমি এসোস্টারিক লিস্প সিনট্যাক্সটি ব্যবহার করব না, বরং সিউডো কোড ব্যবহার করব। এবং আমি একটি সাধারণ অপরিহার্য সমস্যা বিবেচনা করব: তথ্য গোপন এবং মডুলারালিটি । ব্যবহারকারীর (বেশিরভাগ) প্রয়োগে অ্যাক্সেস থেকে বাধা দেওয়ার সময় এক শ্রেণীর অবজেক্টের সংজ্ঞা দেওয়া হচ্ছে।
ধরুন আমি ভেক্টর নামে একটি শ্রেণি তৈরি করতে চাই, যার মধ্যে 2-মাত্রিক ভেক্টরকে উপস্থাপন করা হচ্ছে, যার মধ্যে রয়েছে: ভেক্টর সংযোজন, ভেক্টরের আকার এবং সমান্তরালতা methods
function vectorrec () {
function createrec(x,y) { return [x,y] }
function xcoordrec(v) { return v[0] }
function ycoordrec(v) { return v[1] }
function plusrec (u,v) { return [u[0]+v[0], u[1]+v[1]] }
function sizerec(v) { return sqrt(v[0]*v[0]+v[1]*v[1]) }
function parallelrec(u,v) { return u[0]*v[1]==u[1]*v[0]] }
return [createrec, xcoordrec, ycoordrec, plusrec, sizerec, parallelrec]
}
তারপরে আমি তৈরি করা ভেক্টরকে আসল ফাংশন নামের ব্যবহার করতে পারি assign
[ভেক্টর, এক্সকর্ড, ইকর্ড, ভিপ্লাস, ভার্সাইজ, ভিপ্যারালাল] = ভেক্টরক্লাস ()
এত জটিল কেন? কারণ আমি ভেক্টররিক মধ্যস্থতাকারী ফাংশনটি সংজ্ঞায়িত করতে পারি যে আমি বাকি প্রোগ্রামের কাছে দৃশ্যমান হতে চাই না, যাতে পরিমিতি রক্ষা করতে পারি।
আমরা পোলার স্থানাঙ্কিতে আরেকটি সংগ্রহ করতে পারি
function vectorpol () {
...
function pluspol (u,v) { ... }
function sizepol (v) { return v[0] }
...
return [createpol, xcoordpol, ycoordpol, pluspol, sizepol, parallelpol]
}
তবে আমি উভয়ই উদাসীনতার সাথে ব্যবহার করতে চাই। এটি করার একটি উপায় হ'ল সমস্ত মানগুলিতে একটি প্রকারের উপাদান যুক্ত করা একই পরিবেশে উপরের সমস্ত ফাংশনকে সংজ্ঞায়িত করে: তবে আমি প্রত্যাবর্তিত প্রতিটি ফাংশনকে সংজ্ঞায়িত করতে পারি যাতে এটি প্রথমে স্থানাঙ্কের ধরণের পরীক্ষা করে তারপরে নির্দিষ্ট ফাংশনটি প্রয়োগ করে এর জন্য.
function vector () {
...
function plusrec (u,v) { ... }
...
function pluspol (u,v) { ... }
...
function plus (u,v) { if u[2]='rec' and v[2]='rec'
then return plusrec (u,v) ... }
return [ ..., plus, ...]
}
আমি কী অর্জন করেছি: নির্দিষ্ট ফাংশনগুলি অদৃশ্য থাকে (স্থানীয় শনাক্তকারীদের স্কোপিংয়ের কারণে), এবং প্রোগ্রামের বাকী অংশগুলি কেবল ভেক্টরক্লাসে কল দিয়ে ফিরে আসা সর্বাধিক বিমূর্ত ব্যবহার করতে পারে।
একটি আপত্তি হ'ল আমি প্রোগ্রামের প্রতিটি বিমূর্ত ক্রিয়াটি সরাসরি সংজ্ঞায়িত করতে পারি এবং স্থানাঙ্ক-ধরণের নির্ভরশীল কার্যগুলির সংজ্ঞাটি রেখে যেতে পারি। তারপর পাশাপাশি লুকানো হবে। এটি সত্য, তবে তারপরে প্রতিটি সমন্বয়-প্রকারের কোডটি প্রোগ্রামে ছড়িয়ে থাকা ছোট ছোট টুকরাগুলিতে কাটা হত, যা কম পরিবর্তনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য।
প্রকৃতপক্ষে, আমি তাদের একটি নাম দেওয়ারও প্রয়োজন নেই, এবং আমি টাইপ এবং ফাংশনের নামের প্রতিনিধিত্ব করে একটি স্ট্রিং দ্বারা সূচিযুক্ত কোনও ডেটা স্ট্রাকচারে কেবল বেনামিয় ক্রিয়ামূলক মানগুলি রাখতে পারি। এই কাঠামোটি ফাংশন ভেক্টরের স্থানীয় হওয়ার কারণে প্রোগ্রামের বাকী অংশ থেকে অদৃশ্য।
ব্যবহারটি সরল করার জন্য, ফাংশনটির তালিকা ফিরিয়ে দেওয়ার পরিবর্তে, আমি একটি একক ফাংশন প্রয়োগ করতে পারি যা আর্গুমেন্ট হিসাবে স্পষ্টভাবে টাইপ মান এবং একটি স্ট্রিং গ্রহণ করে, এবং সঠিক প্রকার এবং নাম দিয়ে ফাংশনটি প্রয়োগ করতে পারি। এটি দেখতে অনেকটা ওও ক্লাসের জন্য কোনও পদ্ধতি কল করার মতো দেখাচ্ছে।
অবজেক্ট ওরিয়েন্টেড সুবিধার এই পুনর্নির্মাণে আমি এখানেই থামব।
আমি যা করার চেষ্টা করেছিলাম তা হ'ল উত্তরাধিকার এবং এই জাতীয় অন্যান্য বৈশিষ্ট্য সহ যথেষ্ট শক্তিশালী ভাষায় ব্যবহারযোগ্য অবজেক্ট অরিয়েন্টেশন তৈরি করা খুব কঠিন নয়। দোভাষীর metacircularity সাহায্য করতে পারে, তবে বেশিরভাগই সিনট্যাকটিক স্তরে, যা এখনও তুচ্ছ থেকে দূরে।
অবজেক্ট ওরিয়েন্টেশনের প্রথম ব্যবহারকারীরা সেভাবে ধারণাগুলি পরীক্ষা করেছিলেন। এবং প্রোগ্রামিং ভাষায় অনেক উন্নতির ক্ষেত্রে এটি সাধারণত সত্য true অবশ্যই, তাত্ত্বিক বিশ্লেষণেরও ভূমিকা রয়েছে এবং এই ধারণাগুলি বুঝতে বা পরিমার্জন করতে সহায়তা করেছেন।
তবে যে ভাষাগুলিতে OO বৈশিষ্ট্য নেই সেগুলি কয়েকটি প্রকল্পে ব্যর্থ হওয়ার জন্য বিনষ্ট হয় এই ধারণাটি কেবল অনিয়ন্ত্রিত। যদি প্রয়োজন হয় তবে তারা এই বৈশিষ্ট্যগুলির প্রয়োগ কার্যকরভাবে নকল করতে পারে। অনেক ভাষায় অবজেক্ট ওরিয়েন্টেশনটি বেশ কার্যকরভাবে করার জন্য সিনট্যাক্টিক এবং সিনমেটিক শক্তি থাকে, যদিও এটি অন্তর্নির্মিত না হয়। এবং এটি একটি ট্যুরিং যুক্তির চেয়ে বেশি।
ওওপি অন্যান্য ভাষার সীমাবদ্ধতাগুলিকে সম্বোধন করে না, তবে এটি প্রোগ্রামিং পদ্ধতিগুলিকে সমর্থন করে বা প্রয়োগ করে যা আরও ভাল প্রোগ্রাম লিখতে সহায়তা করে, এইভাবে কম অভিজ্ঞ ব্যবহারকারীদের ভাল অনুশীলনগুলি অনুসরণ করতে সহায়তা করে যা আরও উন্নত প্রোগ্রামাররা সেই সমর্থন ব্যতীত ব্যবহার ও বিকাশ করে চলেছে।
আমি বিশ্বাস করি এগুলি বোঝার জন্য একটি ভাল বই হ'ল অ্যাবেলসন এবং সুসমান: কম্পিউটার প্রোগ্রামগুলির কাঠামো এবং ব্যাখ্যা ।