ওওপি-র আগে ডেটা স্ট্রাকচারের সদস্যরা কি পাবলিক রেখেছিলেন?


44

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

একটি এবং সক্রিয় structক্রিয়াকলাপগুলির একটি সেট ব্যবহার করে একটি প্রক্রিয়াগত ভাষায় প্রয়োগ করা যেতে পারে struct। তবে, পদ্ধতিগত ভাষায় আপনি কোনও structব্যক্তিগত সদস্য তৈরি করতে পারবেন না । পদ্ধতিগত ভাষায় কোনও ডেটা স্ট্রাকচারের সদস্যরা কি জনসাধারণকে ছেড়ে দিয়েছিলেন বা তাদের ব্যক্তিগত করার কোনও কৌশল ছিল?


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

48
@ 8 বিট্রি কী বলেছে তার উপরে আলাদা স্পিন রেখে, আপনার কোড ব্যবহার করা লোকেরা আপনাকে যে ইন্টারফেসটি সেট করে রেখেছিল তা যথাযথভাবে শৃঙ্খলাবদ্ধ থাকলে সবকিছুই সর্বজনীন হওয়া ঠিক। ব্যক্তিগত সদস্য নির্মাণটি এমন লোকদের কারণে ঘটেছিল যারা নিজের নাক নিজের কাছে রাখে না এমন জায়গা থেকে বাইরে রাখতে পারেনি।
ব্ল্রফ্লায়

20
আপনার কি বোঝানো হয়েছে "এনক্যাপসুলেশন জনপ্রিয় হওয়ার আগে"? ওও ভাষাগুলি জনপ্রিয় হওয়ার আগে এনক্যাপসুলেশন বেশ জনপ্রিয় ছিল।
ফ্রাঙ্ক হিলিমান

6
@ ফ্র্যাঙ্কহিলম্যান আমি মনে করি এটিই আসলে প্রশ্নের মূল বিষয়: ওপি জানতে চায় যে সিমুলা /
স্মলটালক

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

উত্তর:


139

OOP এনক্যাপসুলেশন আবিষ্কার করেনি এবং এনক্যাপসুলেশনের সমার্থক নয়। অনেক ওওপি ভাষায় সি ++ / জাভা শৈলীর অ্যাক্সেস সংশোধক নেই। অনেকগুলি অ-ওওপি ভাষার এনক্যাপসুলেশন সরবরাহ করার জন্য বিভিন্ন কৌশল উপলব্ধ।

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

function Adder(x) {
  this.add = function add(y) {
    return x + y;
  }
}

var plus2 = new Adder(2);
plus2.add(7);  //=> 9

উপরের plus2অবজেক্টটির এমন কোনও সদস্য নেই যা এতে সরাসরি অ্যাক্সেসের অনুমতি দেবে x- এটি সম্পূর্ণরূপে আবদ্ধ থাকে। add()পদ্ধতি উপর একটি অবসান হয় xপরিবর্তনশীল।

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

#ifndef ADDER_H
#define ADDER_H

typedef struct AdderImpl *Adder;

Adder Adder_new(int x);
void Adder_free(Adder self);
int Adder_add(Adder self, int y);

#endif

আমরা এখন এমন কোড লিখতে পারি যা এই অ্যাডার ইন্টারফেসটি ব্যবহার করে, এর ক্ষেত্রগুলিতে অ্যাক্সেস ছাড়াই, যেমন:

Adder plus2 = Adder_new(2);
if (!plus2) abort();
printf("%d\n", Adder_add(plus2, 7));  /* => 9 */
Adder_free(plus2);

এবং এখানে সম্পূর্ণ ক্যাপসুলেটেড বাস্তবায়ন বিবরণ হবে:

#include "adder.h"

struct AdderImpl { int x; };

Adder Adder_new(int x) {
  Adder self = malloc(sizeof *self);
  if (!self) return NULL;
  self->x = x;
  return self;
}

void Adder_free(Adder self) {
  free(self);
}

int Adder_add(Adder self, int y) {
  return self->x + y;
}

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

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

তবে হ্যাঁ, অনেকগুলি ভাষায় যেকোনও এনক্যাপসুলেশন ব্যবস্থা নেই। এই ভাষাগুলিতে কাঠামোর সদস্যরা সর্বজনীন হয়ে থাকে। বেশিরভাগ ক্ষেত্রে, নামকরণের সম্মেলনটি নিরুৎসাহিত করার ব্যবস্থা থাকবে। উদাহরণস্বরূপ আমি মনে করি পাস্কালের কোনও কার্যকর এনক্যাপসুলেশন ব্যবস্থা ছিল না।


11
ত্রুটি দেখুন Adder self = malloc(sizeof(Adder));? টাইপডেফ-ইনগ পয়েন্টারগুলির একটি কারণ রয়েছে এবং sizeof(TYPE)এটি সাধারণত নষ্ট হয়।
ডিসিপ্লিকেটর

10
আপনি কেবল লিখতে পারবেন না sizeof(*Adder), কারণ *Adderকোনও প্রকার নয়, ঠিক *int *তেমন কোনও প্রকার নয়। অভিব্যক্তিটি T t = malloc(sizeof *t)মূio় এবং সঠিক উভয়। আমার সম্পাদনা দেখুন।
wchargin

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

6
সম্ভবত পাসকাল চেয়ে ভাল উদাহরণ পাইথন, যা অবজেক্ট অভিযোজন কিন্তু কোন এনক্যাপস্যুলেশন সমর্থন করে, যেমন নামকরণ নিয়মাবলী অবলম্বন হয় _private_memberএবং output_property_, বা imutable বস্তু তৈরীর জন্য আরো উন্নত কৌশল।
মেফি

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

31

প্রথমত, প্রক্রিয়াভিত্তিক বনাম অবজেক্ট ভিত্তিক হওয়ার জনসাধারণের সাথে প্রাইভেটের সাথে কোনও সম্পর্ক নেই। প্রচুর অবজেক্ট ওরিয়েন্টেড ভাষাগুলির অ্যাক্সেস নিয়ন্ত্রণের কোনও ধারণা নেই।

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

foo.h:

struct queue;
struct queue* makeQueue();
void add2Queue(struct queue* q, int value);
...

foo.c:

struct queue {
    int* head;
    int* head;
};
struct queue* makeQueue() { .... }
void add2Queue(struct queue* q, int value) { ... }

উইন্ডোজ এসডিকে দেখুন! এটি HANDLE এবং UINT_PTR ব্যবহার করে এবং এপিআই-তে ব্যবহৃত স্মৃতিতে জেনেরিক হ্যান্ডেল হওয়ার মতো জিনিসগুলি - কার্যকরভাবে কার্যকরকরণগুলি ব্যক্তিগত করে তোলে।


1
আমার নমুনা আরও ভাল (সি) পদ্ধতির প্রদর্শন করেছে - ফরওয়ার্ড ঘোষিত স্ট্রাইক ব্যবহার করে। শূন্য * পদ্ধতির ব্যবহারের জন্য আমি টাইপডেফগুলি ব্যবহার করব: .h ফাইলে টাইপডেফ শূন্য * সারিটি বলুন এবং তারপরে সর্বত্র আমাদের স্ট্রাক্ট কিউ কেবল কাতারে বলুন; তারপরে .c ফাইলে স্ট্রাক্ট কিউকে স্ট্রাক্ট কিউআইএমপিএলে নতুন নামকরণ করুন এবং যে কোনও আর্গুমেন্ট সারি হয়ে উঠবে (স্ট্রাক্ট কিউ * এর ইস্তিস্টেড) এবং এই জাতীয় প্রতিটি ফাংশনের কোডের প্রথম লাইন স্ট্রাক্ট কিউআইএমপিএল * কিউ = (স্ট্রাক্ট কিউআইপল *) কিউ হয়ে যায়
লুইস প্রিঙ্গল

7
হুম। এটি এটিকে ব্যক্তিগত করে তোলে কারণ আপনি এর প্রয়োগের (foo.c ফাইল) ছাড়া যে কোনও জায়গা থেকে 'সারি'র কোনও ক্ষেত্র অ্যাক্সেস করতে (পড়তে বা লিখতে পারবেন না)। আপনি ব্যক্তিগত বলতে আর কি বোঝাতে চেয়েছিলেন? বিটিডাব্লু - টাইপডেফ অকার্যকর * অ্যাপোরিচ এবং (আরও ভাল) এগিয়ে কাঠামো পদ্ধতির ঘোষণা দেয়
লুইস প্রিংল

5
স্মার্টটাক -৮০-তে বইটি পড়ে আমার প্রায় 40 বছর কেটে গেছে তা স্বীকার করতেই হবে, তবে আমি সরকারী বা বেসরকারী ডেটা সদস্যদের কোনও ধারণা মনে করতে পারি না। আমি মনে করি সিএলওএস-এরও তেমন কোনও ধারণা ছিল না। অবজেক্ট পাস্কালের এ জাতীয় ধারণা ছিল না। আমি স্মরণ করি সিমুলা করেছিল (সম্ভবত যেখানে স্ট্রস্ট্রুপ ধারণা পেয়েছিল), এবং সি ++ এর পরে বেশিরভাগ ওও ভাষাগুলির রয়েছে। যাইহোক - আমরা সম্মতি দিচ্ছি এনক্যাপসুলেশন এবং ব্যক্তিগত ডেটা ভাল ধারণা। এমনকি মূল প্রশ্নকর্তাও এই বিষয়টিতে পরিষ্কার ছিলেন। তিনি কেবল জিজ্ঞাসা করছিলেন - প্রবীণরা কীভাবে প্রাক-সি ++ ভাষায় এনক্যাপসুলেশন করেন?
লুইস প্রিংল

5
@ লুইসপ্রিংলে স্মল্টালক -৮০ এ পাবলিক ডেটা সদস্যের কোনও উল্লেখ নেই কারণ আপনি "প্রতিবিম্ব" ব্যবহার না করলে সমস্ত "ইনস্ট্যান্স ভেরিয়েবল" (ডেটা সদস্য) ব্যক্তিগত। এএএএআইইউ স্মার্ট টেলিকরা প্রকাশ্যে যে সমস্ত পরিবর্তনশীল চায় তার জন্য একটি অ্যাকসেসর লেখেন।
dcorking

4
@ লুইসপ্রিংল এর বিপরীতে, সমস্ত স্মার্টটাক "পদ্ধতি" (ফাংশন সদস্য) জনসাধারণ (তাদের ব্যক্তিগত চিহ্নিত করার জন্য
আনাড়িপূর্ণ

13

30 বছর আগে যখন আমি কম্পিউটার বিজ্ঞান ডিগ্রি নিয়েছিলাম তখন "ওপাক ডেটা টাইপস" একটি সুপরিচিত ধারণা ছিল। আমরা OOP কভার করি নি কারণ এটি তখন সাধারণ ব্যবহারে ছিল না এবং "ফাংশনাল প্রোগ্রামিং "টিকে আরও সঠিক বলে মনে করা হয়েছিল।

মডিউলা -২ এর তাদের সরাসরি সমর্থন ছিল, https://www.modula2.org/references/modules.php দেখুন

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

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

প্রতিটি বড় আকারের প্রকল্পে আমি কাজ করেছি, (আমি আগে সি ++ এ সরে যাওয়ার আগে) ভুল কোড দ্বারা "ব্যক্তিগত" ডেটা অ্যাক্সেস করা রোধ করার জন্য একটি ব্যবস্থা ছিল। এটি এখনকার চেয়ে কিছুটা কম মানসম্মত ছিল।


9

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

সেখানে প্রবেশাধিকার "ব্যক্তিগত" ভেরিয়েবল সবচেয়ে প্রচলিত হচ্ছে কঠিন করতে চান কৌশল আছে PIMPL বাগ্ধারা । এটি আপনার জনসাধারণের শিরোনাম ফাইলগুলিতে কেবলমাত্র একটি পয়েন্টার বরাদ্দ করে আপনার প্রাইভেট ভেরিয়েবলগুলি একটি পৃথক কাঠামোয় রাখে। এর অর্থ কোনও প্রাইভেট ভেরিয়েবল পাওয়ার জন্য একটি অতিরিক্ত বিন্যাস এবং aালাই, এরকম কিছু ((private_impl)(obj->private))->actual_value, যা বিরক্তিকর হয়, তাই অনুশীলনে খুব কমই ব্যবহৃত হয়।


4

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

ফিরে আসা যাক এবং এখানে ইতিহাসের কিছুটা পাওয়া যাক ...

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

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

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

সুতরাং মডিউলা -2 এবং অ্যাডা (83) এ আপনি কোনও নেমস্পেসের ব্যক্তিগত বা জনসাধারণের মধ্যে যে কোনও রুটিন, টাইপ, ধ্রুবক বা বস্তু ঘোষণা করতে পারেন, তবে আপনার যদি রেকর্ড টাইপ থাকে তবে কয়েকটি রেকর্ড ক্ষেত্রগুলি পাবলিক ঘোষণার কোনও (সহজ) উপায় ছিল না এবং অন্যরা ব্যক্তিগত। হয় আপনার পুরো রেকর্ডটি সর্বজনীন, না হয় নয়।


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

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

@ ডেভিড - এটি অ্যাডা 95 বছরের যুগে আদা সম্প্রদায়ের যুক্তি ছিল। আমি বিশ্বাস করি যে অবশেষে তারা ধারণাগত লিপ করতে পারেনি এমন লোকদের object.method()বিকল্প বিকল্প হিসাবে মঞ্জুরি দিয়ে তারা তাদের নিজস্ব যুক্তি প্রমাণ করেছে method(object, ...)
টেড

0

সি তে আপনি ইতিমধ্যে ঘোষিত কিন্তু অপরিজ্ঞাত ধরণের পয়েন্টারগুলির কাছাকাছি যেতে পারতেন যেমন অন্যরা বলেছিলেন, কার্যত সমস্ত ক্ষেত্রে অ্যাক্সেসকে সীমাবদ্ধ করে।

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

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


সি'র একমাত্র বৈশিষ্ট্যটি ছিল বিশেষভাবে তথ্য staticগোপনের জন্য যা ছিল বৈশ্বিক ডেটা এবং অপারেশন (যার অর্থ তারা অন্য সংকলন থেকে লিঙ্কারের কাছে উপস্থাপন করা হয়নি)। আপনি ভাল সফ্টওয়্যার ডিজাইনের অনুশীলনের জন্য সি এর যে কোনও সমর্থন সমর্থন করেছিলেন তা স্পষ্টতই যুক্তিযুক্তভাবে বলতে পারেন যে এটি হ্যাক ছিল এবং 1972 সালে ভাষার মূল নকশার অংশ নয়
টেড

0

যদি আপনার সর্বজনীন সংজ্ঞাটি কোনও বিন্দুতে আপনার নিজস্ব কোডের মাধ্যমে প্রয়োগকরণ এবং ডেটা / বৈশিষ্ট্যগুলিতে অ্যাক্সেস করার ক্ষমতা হয় তবে উত্তরটি কেবল সহজ: হ্যাঁ । তবে এটি বিভিন্ন উপায়ে বিমূর্ত ছিল - ভাষার উপর নির্ভর করে।

আমি আশা করি এটি আপনার প্রশ্নের সান্নিধ্যে উত্তর দিয়েছে।


-1

এখানে একটি খুব সহজ পাল্টা উদাহরণ দেওয়া আছে: জাভাতে, interfaceগুলি বস্তুর সংজ্ঞা দেয়, তবে classএসগুলি তা করে না। একটি classসংজ্ঞায়িত একটি বিমূর্ত ডাটা টাইপ, না একটি বস্তু।

তবে , আপনি জাভাতে যে কোনও সময় ব্যবহার privateকরেন classনা কেন, আপনার কাছে ব্যক্তিগত সদস্যদের সাথে ডেটা কাঠামোর একটি উদাহরণ রয়েছে যা অবজেক্ট-ভিত্তিক নয়।


7
এই উত্তরটি অবশ্যই প্রযুক্তিগতভাবে সঠিক, তবে এটিডিটি কী কী এবং কীভাবে তারা বস্তুর থেকে পৃথক তা ইতিমধ্যে জানে না এমন কারও পক্ষে এটি সম্পূর্ণই বোধগম্য।
আমন

1
আমি এই উত্তর থেকে কিছু শিখেছি।
লিটল

3
ইন্টারফেস না না বস্তু "define"; তারা ক্রিয়াকলাপ / আচরণের জন্য চুক্তি নির্দিষ্ট করে যা বস্তুগুলি করতে পারে বা সম্পাদন করতে পারে । উত্তরাধিকার যেমন সাধারণত একটি দ্বারা বর্ণিত হয় একটি সম্পর্ক এবং একটি দ্বারা রচনা একটি সম্পর্ক আছে, ইন্টারফেস সাধারণত সম্পর্ক করতে পারেন দ্বারা বর্ণিত হয় ।
কোড_ড্রেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.