আপনি কখন একই বস্তুর দুটি উল্লেখ চান?


20

জাভাতে বিশেষত, তবে সম্ভবত অন্যান্য ভাষায়ও: একই বস্তুর দুটি উল্লেখ থাকতে কখন কার্যকর হবে?

উদাহরণ:

Dog a = new Dog();
Dob b = a;

এমন কোন পরিস্থিতি রয়েছে যেখানে এটি কার্যকর হবে? aআপনি যখনই প্রতিনিধিত্ব করা অবজেক্টটির সাথে ইন্টারেক্ট করতে চান এটি কেন ব্যবহারের পছন্দসই সমাধান হবে a?


এটি ফ্লাইওয়েট প্যাটার্নের পিছনের মূল অংশ ।

@ মিশেলটি কি আপনি বিস্তারিত বলতে পারবেন?
বেসিনেটর

7
যদি aএবং b সর্বদা একই হিসাবে উল্লেখ করা হয় Dog, তবে এটির কোনও লাভ নেই। যদি তারা কখনও কখনও হতে পারে, তবে এটি বেশ কার্যকর।
গাবে

উত্তর:


45

একটি উদাহরণ হ'ল যখন আপনি দুটি পৃথক তালিকায় একই জিনিস রাখতে চান :

Dog myDog = new Dog();
List dogsWithRabies = new ArrayList();
List dogsThatCanPlayPiano = new ArrayList();

dogsWithRabies.add(myDog);
dogsThatCanPlayPiano.add(myDog);
// Now each List has a reference to the same dog

আরেকটি ব্যবহার হ'ল যখন আপনার একই জিনিসটি বেশ কয়েকটি ভূমিকা পালন করে :

Person p = new Person("Bruce Wayne");
Person batman = p;
Person ceoOfWayneIndustries = p;

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

44
-১ ব্যাটম্যানের গোপন পরিচয় প্রকাশের জন্য।
অগস্ট

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

2
লিখিত হিসাবে ব্রুস ওয়েন উদাহরণটি কার্যকর না হলেও, আমি বিশ্বাস করি যে বর্ণিত উদ্দেশ্যটি সঠিক intention সম্ভবত একটি নিকটতর উদাহরণ হতে পারে Persona batman = new Persona("Batman"); Persona bruce = new Persona("Bruce Wayne"); Persona currentPersona = batman;- যেখানে আপনার একাধিক সম্ভাব্য মান (বা উপলভ্য মানের একটি তালিকা) রয়েছে এবং বর্তমানে সক্রিয় / নির্বাচিতটির একটি উল্লেখ রয়েছে।
ড্যান পুজে

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

16

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

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

void encounter(Dog a) {
  hissAt(a);
}

void hissAt(Dog b) {
  // ...
}

আপনি যখন শর্তের উপর নির্ভর করে দুটি অবজেক্টের মধ্যে একটি ব্যবহার করেন তখন একটি কম সাধারণ ক্ষেত্রে, আপনি যা পছন্দ করেন না কেন মূলত একই জিনিসটি করেন:

Dog a, b;
Dog goodBoy = whoseAGoodBoy ? a : b;
feed(goodBoy);
walk(goodBoy);
pet(goodBoy);

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


3
"কম সাধারণ কেস" বেশ সাধারণ: আপনার তালিকাগুলি বা মানচিত্রে অবজেক্টস রয়েছে, আপনি যা চান তা পুনরুদ্ধার করুন এবং প্রয়োজনীয় অপারেশনগুলি সম্পাদন করুন। আপনি মানচিত্র বা তালিকা থেকে তাদের উল্লেখ মুছবেন না।
এসজেউন 76

1
@ এস জুয়ান The76 "কম সাধারণ ক্ষেত্রে" কেবল স্থানীয় ভেরিয়েবল থেকে নেওয়া, ডাটা স্ট্রাকচারের সাথে জড়িত যে কোনও কিছুই শেষ পয়েন্টের আওতায় আসে।

রেফারেন্স-গণনা মেমরি পরিচালনার কারণে এটি কি কেবল একটি রেফারেন্সের আদর্শ? যদি তা হয় তবে এটি উল্লেখযোগ্য হবে যে প্রেরণা বিভিন্ন আবর্জনা সংগ্রহকারী (যেমন সি #, জাভা, পাইথন) সহ অন্যান্য ভাষার সাথে প্রাসঙ্গিক নয়
মার্কজে

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

6

অস্থায়ী পরিবর্তনশীল: নিম্নলিখিত সিউডোকোড বিবেচনা করুন।

Object getMaximum(Collection objects) {
  Object max = null;
  for (Object candidate IN objects) {
    if ((max is null) OR (candidate > max)) {
      max = candidate;
    }
  }
  return max;
}

ভেরিয়েবল maxএবং candidateএকই অবজেক্টের দিকে নির্দেশ করতে পারে তবে ভেরিয়েবল অ্যাসাইনমেন্ট বিভিন্ন নিয়ম এবং বিভিন্ন সময়ে ব্যবহার করে পরিবর্তিত হয়।


3

অন্যান্য উত্তরগুলির পরিপূরক করতে, আপনি একই স্থান থেকে শুরু করে কোনও ডেটা স্ট্রাকচারকে অন্যভাবে অতিক্রম করতে চাইতে পারেন। উদাহরণস্বরূপ, যদি আপনার একটি থাকে BinaryTree a = new BinaryTree(...); BinaryTree b = a, আপনি গাছের বাম দিকের পথটি aএবং এর ডানদিকের পথটি দিয়ে bকিছুটা ব্যবহার করে অতিক্রম করতে পারেন:

while (!a.equals(null) && !b.equals(null)) {
    a = a.left();
    b = b.right();
}

আমি জাভা লিখেছি তার কিছুক্ষণ হয়েছে, যাতে কোডটি সঠিক বা বুদ্ধিমান নাও হতে পারে। সিউডোকোড হিসাবে এটি আরও গ্রহণ করুন।


3

এই পদ্ধতিটি দুর্দান্ত যখন আপনার কাছে বেশ কয়েকটি অবজেক্ট থাকে যা সমস্ত অপরকে আবার কল করে যা অযৌক্তিকভাবে ব্যবহার করা যায়।

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

Tab Tab1 = new Tab();
Tab Tab2 = new Tab();
Tab Tab3 = new Tab();
Tab CurrentTab = new Tab();

তারপরে, ক্লিক করা প্রতিটি নম্বরযুক্ত ট্যাবে ক্লিক করে আপনি বর্তমান ট্যাবটিকে সেই ট্যাবটিকে উল্লেখ করতে পারেন।

CurrentTab = Tab3;

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


3

প্রচুর পরিস্থিতি রয়েছে যেখানে দরকারী হওয়ার জন্য " " অজানা সম্পর্কিত একটি উল্লেখ b থাকতে হবে a। নির্দিষ্টভাবে:

  • bসংকলন-সময় কোনটি নির্দেশ করবে তা আপনি জানেন না ।
  • সংকলনের সময় জানা আছে কিনা তা যে কোনও সময় আপনাকে সংগ্রহের মাধ্যমে পুনরাবৃত্তি করতে হবে
  • যে কোনও সময় আপনার সীমিত সুযোগ রয়েছে

উদাহরণ স্বরূপ:

পরামিতি

public void DoSomething(Thing &t) {
}

t বাইরের স্কোপ থেকে চলকটির একটি রেফারেন্স।

মান এবং অন্যান্য শর্তাধীন মানগুলি ফেরত দিন

Thing a = Thing.Get("a");
Thing b = Thing.Get("b");
Thing biggerThing = Thing.max(a, b);
Thing z = a.IsMoreZThan(b) ? a : b;

biggerThingএবং zপ্রতিটি হয় aবা হয় রেফারেন্স b। সংকলন সময়ে আমরা জানি না।

লাম্বদাস এবং তাদের ফেরতের মান values

Thing t = someCollection.FirstOrDefault(x => x.whatever > 123);

xএকটি প্যারামিটার (উদাহরণস্বরূপ 1 উপরে), এবং tএকটি রিটার্ন মান (উদাহরণ 2 উপরের)

সংগ্রহগুলি

indexByName.add(t.name, t);
process(indexByName["some name"]);

index["some name"]অনেকাংশে আরও পরিশীলিত চেহারা b। এটি তৈরি করা হয়েছে এবং সংগ্রহের মধ্যে স্টাফ করা একটি বস্তুর একটি উপনাম।

loops

foreach (Thing t in things) {
 /* `t` is a reference to a thing in a collection */
}

t একটি আইট্রেটার (পূর্ববর্তী উদাহরণ) দ্বারা প্রত্যাবর্তিত আইটেমের (উদাহরণ 2) এর একটি উল্লেখ reference


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

1
@HCBPshenanigans আমি আশা করি আপনি নির্বাচিত উত্তর পরিবর্তন করবেন না; তবে, আমি আমার আপডেট করেছি আশা করি পাঠযোগ্যতার জন্য সহায়তা করতে এবং নির্বাচিত উত্তর থেকে অনুপস্থিত কিছু ব্যবহারের ক্ষেত্রে পূরণ করতে।
এসভিডজেন

2

এটি একটি গুরুত্বপূর্ণ বিষয়, তবে আইএমএইচও বোঝার জন্য মূল্যবান।

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

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

আপনি যখনই aঅন্য কোনও ফাংশনে আর্গুমেন্ট / প্যারামিটার হিসাবে পাস করেন, যেমন কল করা
foo(Dog aDoggy);
বা কোনও পদ্ধতি প্রয়োগ করার জন্য a, অন্তর্নিহিত প্রোগ্রাম কোডটি একই অবজেক্টের দ্বিতীয় রেফারেন্স তৈরি করতে, রেফারেন্সের একটি অনুলিপি তৈরি করে।

তদ্ব্যতীত, অনুলিপি করা রেফারেন্স সহ কোডটি যদি অন্য থ্রেডে থাকে, তবে উভয় একই বস্তুকে অ্যাক্সেস করতে একযোগে ব্যবহার করা যেতে পারে।

সুতরাং বেশিরভাগ দরকারী প্রোগ্রামগুলিতে একই বস্তুর একাধিক উল্লেখ থাকবে, কারণ এটি বেশিরভাগ ওও প্রোগ্রামিং ভাষার শব্দার্থক।

এখন, যদি আমরা এটা আমার মনে হয় কারণ রেফারেন্স দ্বারা ক্ষণস্থায়ী হয় শুধুমাত্র প্রক্রিয়া অনেক OO যেমন পণ্য ভাষা (সি ++ সমর্থন উভয়) পাওয়া যায়, আমরা এটা 'অধিকার' বলে আশা করা হতে পারে ডিফল্ট আচরণ।

আইএমএইচও, কয়েকটি কারণের জন্য রেফারেন্সগুলি ব্যবহার করা সঠিক ডিফল্ট :

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

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

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

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

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

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

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

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

অন্য কোনও শব্দার্থবিজ্ঞান পরিচালনা করা আরও শক্ত হবে।

Dog a = new Dog("rover");  // initialise with name 
DogList dl = new DogList()
dl.add(a)
...
a.setOwner("Mr Been")

আমি প্রস্তাব দিই যে "রোভার" এর dlদ্বারা প্রভাবিত হওয়া উচিত setOwnerবা প্রোগ্রামগুলি লিখতে, বুঝতে, ডিবাগ করতে বা সংশোধন করা শক্ত হয়। আমি মনে করি বেশিরভাগ প্রোগ্রামাররা বিস্মিত হবে বা অন্যথায় হতাশ হবে।

পরে, কুকুরটি বিক্রি হয়:

soldDog = dl.lookupOwner("rover", "Mr Been")
soldDog.setOwner("Mr Mcgoo")

এই ধরণের প্রক্রিয়াকরণ সাধারণ এবং সাধারণ। সুতরাং রেফারেন্স শব্দার্থবিজ্ঞানগুলি ডিফল্ট কারণ এটি সাধারণত সর্বাধিক বোধ করে।

সংক্ষিপ্তসার: একই বস্তুর একাধিক উল্লেখ থাকা সর্বদা বোধগম্য।


ভাল কথা, তবে এটি একটি মন্তব্য হিসাবে আরও উপযুক্ত
বাসিনেটর

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

1

অবশ্যই, অন্য একটি দৃশ্য যেখানে আপনি শেষ করতে পারেন:

Dog a = new Dog();
Dog b = a;

আপনি যখন কোড বজায় রাখছেন এবং bএকটি ভিন্ন কুকুর, বা অন্য কোনও শ্রেণীর হিসাবে ব্যবহৃত হতেন, তবে এখন এটি দ্বারা পরিবেশন করা হবে a

সাধারণত, মাঝারি মেয়াদে, aসরাসরি উল্লেখ করার জন্য আপনার সমস্ত কোডটি পুনরায় কাজ করা উচিত , তবে এটি সরাসরি ঘটে না।


1

আপনি চাইবেন যে কোনও সময় আপনার প্রোগ্রামটির একাধিক স্থানে স্মৃতিতে কোনও সত্তা টানার সম্ভাবনা রয়েছে, সম্ভবত বিভিন্ন উপাদান এটি ব্যবহার করছে।

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


0

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


-2

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

উদাহরণস্বরূপ, যদি আপনার দুটি টেবিল থাকে:

কুকুর:

  • আইডি | মালিক_আইডি | নাম
  • 1 | 1 | বার্ক কেন্ট

মালিক:

  • আইডি | নাম
  • 1 | আমাকে
  • 2 | আপনি

নিম্নলিখিত কলগুলি করা হলে আপনার ওআরএম করতে পারে এমন বেশ কয়েকটি পদ্ধতি রয়েছে:

dog = Dog.find(1)  // fetch1
owner = Owner.find(1) // fetch2
superdog = owner.dogs.first() // fetch3
superdog.name = "Superdog"
superdog.save! // write1
owner = dog.owner // fetch4
owner.name = "Mark"
owner.save! // write2
dog.owner = Owner.find(2)
dog.save! // write3

নিষ্পাপ কৌশলটিতে, মডেলগুলিতে সমস্ত কল এবং সম্পর্কিত রেফারেন্স পৃথক বস্তু পুনরুদ্ধার করে। Dog.find(), Owner.find(), owner.dogs, এবং dog.ownerএকটি ডাটাবেসের মধ্যে ফলাফলের প্রায় প্রথমবার, যার পরে তারা মেমরির এ সঞ্চিত হয় চাপুন। এবং তাই:

  • ডেটাবেস কমপক্ষে 4 বার থেকে নেওয়া হয়
  • কুকুর। মালিক সুপারডগ। মালিক হিসাবে একই নয় (পৃথকভাবে আনা হয়েছে)
  • কুকুরের নাম সুপারডগ.নামের মতো নয়
  • কুকুর এবং সুপারডগ উভয়ই একই সারিতে লেখার চেষ্টা করে এবং একে অপরের ফলাফলকে ওভাররাইট করে দেয়: Writ33 Writ1 এ নাম পরিবর্তনকে পূর্বাবস্থায় ফিরিয়ে আনবে।

কোনও রেফারেন্স ছাড়াই আপনার আরও আনতে হবে, আরও মেমরি ব্যবহার করুন এবং পূর্ববর্তী আপডেটগুলি ওভাররাইট করার সম্ভাবনাটি প্রবর্তন করুন।

মনে করুন যে আপনার ওআরএম জানে যে কুকুরের টেবিলের সারি 1-এর সমস্ত রেফারেন্স একই জিনিসকে নির্দেশ করবে। তারপর:

  • Owner.find (1) এর সাথে স্মরণে মেমরিতে কোনও অবজেক্ট থাকায় ফেচ 4 অপসারণ করা যায়। ফ্যাচ 3 এর পরে কমপক্ষে একটি সূচক স্ক্যানের ফলাফল ঘটবে, কারণ মালিকের মালিকানাধীন অন্যান্য কুকুর থাকতে পারে, তবে একটি সারি পুনরুদ্ধার ট্রিগার করবে না।
  • কুকুর এবং সুপারডগ একই পয়েন্ট।
  • কুকুর.নাম এবং সুপারডগ.নাম একই বস্তুতে নির্দেশ করে।
  • dog.owner এবং superdog.owner একই বস্তুতে নির্দেশ করে।
  • Writ3 লেখার পরিবর্তনে ওভাররাইট করে না।

অন্য কথায়, রেফারেন্সগুলি ব্যবহার করে সত্যের একক পয়েন্ট (কমপক্ষে সেই থ্রেডের মধ্যে) ডাটাবেসে সারি হওয়ার নীতিটি কোড করতে সহায়তা করে।

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