কোনও শ্রেণীর নিজস্ব তালিকার উপশ্রেণী হিসাবে সংজ্ঞায়িত করার অসুবিধা কী হবে?


48

আমার সাম্প্রতিক প্রকল্পে, আমি নিম্নলিখিত শিরোনাম সহ একটি শ্রেণি সংজ্ঞায়িত করেছি:

public class Node extends ArrayList<Node> {
    ...
}

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

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

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

এর জন্য আমার ব্যবহার বিবেচনা করে আমার কোডে এটি ব্যবহার না করার কোনও বৈধ কারণ আছে কি ?


I যদি আমাকে আরও ব্যাখ্যা করার দরকার হয় তবে আমি খুশি হব; আমি কেবল এই প্রশ্নটি সংক্ষিপ্ত রাখার চেষ্টা করছি।



1
@ গ্যানাট এর তালিকাগুলি সহ তালিকাগুলি রাখার চেয়ে ক্লাসটিকে নিজের তালিকা হিসাবে কঠোরভাবে সংজ্ঞায়িত করার সাথে আরও অনেক কিছু করতে পারে। আমি মনে করি এটি একটি অনুরূপ জিনিসের বৈকল্পিক, তবে সম্পূর্ণ একই নয়। এই প্রশ্নটি রবার্ট হার্ভির উত্তরের লাইন ধরে কিছু বোঝায় ।
অ্যাডিসন ক্রম্প 21

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

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

1
হয়তো আমি কিছুটা মিস করছি, তবে বাস্তবায়নের তুলনায় আপনার কি সত্যিই প্রসারিত করা দরকার ? ArrayList<Node> List<Node>
ম্যাথিয়াস

উত্তর:


107

সত্যি বলতে কী, আমি এখানে উত্তরাধিকারের প্রয়োজন দেখছি না। এটা বোঝা যায় না; Node একটি হল ArrayList এর Node?

যদি এটি কেবল একটি পুনরাবৃত্ত তথ্য কাঠামো হয় তবে আপনি কেবল এমন কিছু লিখবেন:

public class Node {
    public String item;
    public List<Node> children;
}

যা বোঝায় না; নোডে বাচ্চাদের বা বংশধর নোডগুলির একটি তালিকা রয়েছে।


34
এটি একই জিনিস নয়। তালিকার একটি নতুন তালিকার পাশাপাশি যদি আপনি কিছু সংরক্ষণ না করেন তবে বিজ্ঞাপন-ইনফিনিটামের তালিকার একটি তালিকা অর্থহীন । এটি যা আছে, এবং তালিকাগুলি থেকে স্বাধীনভাবে পরিচালনা করে। ItemItem
রবার্ট হার্ভে

6
ওহ, আমি এখন দেখতে। আপনাদের দ্বারস্থ হয়েছিল Node একটি হল ArrayList এর Nodeহিসাবে Node 0 অনেকের কাছে রয়েছে Node বস্তু। তাদের ফাংশন, একই মূলত, কিন্তু এর পরিবর্তে এর হচ্ছে অবজেক্টের মত একটি তালিকা, এটা হয়েছে অবজেক্টের মত একটি তালিকা। লিখিত শ্রেণীর জন্য মূল নকশাটি বিশ্বাস ছিল যে যে কোনও Nodeএকটি সাব- Nodeএসের সেট হিসাবে প্রকাশ করা যেতে পারে , যা উভয় বাস্তবায়নই করে তবে এটি অবশ্যই কম বিভ্রান্তিকর। +1
অ্যাডিসন ক্রম্প

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

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


57

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

সংক্ষিপ্ত আকার SOLID ভাল বস্তু-ভিত্তিক নকশার জন্য কিছু হিউরিস্টিক্স সরবরাহ করে। এখানে, আই নটারফেস বিভাজন নীতি (আইএসপি) এবং এল ইসকোভ সাবস্টিটিউশন প্রিসিনপল (এলএসপি) এর কিছু বলার আছে।

আইএসপি আমাদের ইন্টারফেসগুলি যতটা সম্ভব ছোট রাখতে বলে। তবে উত্তরাধিকার সূত্রে ArrayListআপনি অনেকগুলি এবং অনেক পদ্ধতি পান। এটা অর্থপূর্ণ হয় get(), remove(), set()(প্রতিস্থাপন), অথবা add()একটি নির্দিষ্ট সূচিতে (সন্নিবেশ) একটি শিশু নোড? ensureCapacity()অন্তর্নিহিত তালিকার পক্ষে এটি বোধগম্য ? এটি sort()নোডের অর্থ কী ? আপনার শ্রেণীর ব্যবহারকারীদের কি আসলেই একটি পাওয়ার কথা subList()? যেহেতু আপনি চান না এমন পদ্ধতিগুলি আপনি গোপন করতে পারবেন না, কেবলমাত্র সমাধান হ'ল অ্যারেলিস্টকে সদস্য ভেরিয়েবল হিসাবে রাখা, এবং আপনি যে পদ্ধতিগুলি চান প্রকৃতপক্ষে ফরোয়ার্ড করুন:

private final ArrayList<Node> children = new ArrayList();
public void add(Node child) { children.add(child); }
public Iterator<Node> iterator() { return children.iterator(); }

ডকুমেন্টেশনে আপনি যে সমস্ত পদ্ধতি দেখেন তা যদি আপনি সত্যিই চান তবে আমরা এলএসপিতে যেতে পারি। এলএসপি আমাদের জানায় যে প্যারেন্ট ক্লাসটি যেখানেই আশা করা হচ্ছে সেখানে অবশ্যই আমাদের সাবক্লাস ব্যবহার করতে সক্ষম হব। যদি কোনও ফাংশন একটি ArrayListপ্যারামিটার হিসাবে নেয় এবং আমরা Nodeতার পরিবর্তে আমাদের পাস করি তবে কিছুই পরিবর্তন হওয়ার কথা নয়।

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

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

public class Node extends ArrayList<Node> {
  public final int value;

  public Node(int value, Node... children) {
    this.value = Value;
    for (Node child : children)
      add(child);
  }

  ...

}

এটির প্রয়োজন এটি কার্যকর করতে valueপারে না hashCode()এবং প্রভাব ফেলতে পারে না equals()Listইন্টারফেস - যা আপনি এটা থেকে inheriting দ্বারা সম্মান অঙ্গীকার - প্রয়োজন new Node(0).equals(new Node(123))সত্য হতে পারে।


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

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

এরকম একটি উদাহরণ হ'ল কর্মচারী-বসের মডেলিংয়ের সমস্যা। আমাদের Personএকটি নাম এবং ঠিকানা সহ একাধিক গুলি রয়েছে। একটি Employeeএকটি Personএবং এর একটি আছে Boss। একটি Bossএকটি হল Person। তাই আমি একটি তৈরি করা উচিত Personবর্গ যে উত্তরাধিকারসূত্রে হয় Bossএবং Employee? এখন আমার একটি সমস্যা আছে: বসও একজন কর্মচারী এবং আরও একটি উচ্চতর রয়েছে। সুতরাং এটি Bossপ্রসারিত করা উচিত বলে মনে হচ্ছে Employee। কিন্তু এটি CompanyOwnerএকটি Bossকিন্তু একটি নয় Employee? যে কোনও ধরণের উত্তরাধিকারের গ্রাফটি এখানে কোনওভাবে ভেঙে যাবে।

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


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

17

নিজের হিসাবে ধারক প্রসারিত করা সাধারণত খারাপ অভ্যাস হিসাবে গৃহীত হয়। কেবল একটি রাখার পরিবর্তে একটি ধারক বাড়ানোর সত্যিই খুব কম কারণ রয়েছে। নিজের ধারককে বাড়ানো এটিকে অতিরিক্ত অদ্ভুত করে তোলে।


14

যা বলা হয়েছে তাতে যুক্ত করে এই ধরণের কাঠামো এড়াতে কিছুটা জাভা-নির্দিষ্ট কারণ রয়েছে।

equalsতালিকাগুলির জন্য পদ্ধতির চুক্তির জন্য একটি তালিকা অন্য বস্তুর সমান বিবেচনা করা দরকার

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

সূত্র: https://docs.oracle.com/javase/7/docs/api/java/util/List.html#equals(java.lang.Object)

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


1
এটি আমার অভ্যাস থেকে খারাপ অভ্যাস বাদ দিয়ে অপসারণ করার একটি দুর্দান্ত কারণ। : পি
অ্যাডিসন ক্রম্প

3

স্মৃতি সম্পর্কে:

আমি বলব এটি পরিপূর্ণতাবাদের বিষয় a এর ArrayListমতো দেখতে ডিফল্ট-নির্মাণকারী :

public ArrayList(int initialCapacity) {
     super();

     if (initialCapacity < 0)
         throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);

     this.elementData = new Object[initialCapacity];
 }

public ArrayList() {
     this(10);
}

উত্স । এই কনস্ট্রাক্টরটি ওরাকল-জেডিকেতেও ব্যবহৃত হয়।

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

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

সম্পাদনা: মন্তব্যগুলি সম্পর্কে স্পষ্টতা (@ এক্ষেত্রে সুনির্দিষ্ট হতে হবে)। উত্তরের এই বিভাগটি উত্তরাধিকারের বিষয়টি নিয়ে কাজ করে না । মেমোরি ব্যবহারের তুলনাটি এককভাবে সংযুক্ত তালিকার সাথে এবং সেরা মেমোরি-ব্যবহারের সাথে তৈরি করা হয় (প্রকৃত বাস্তবায়নে ফ্যাক্টরটি কিছুটা পরিবর্তিত হতে পারে তবে এটি যথেষ্ট পরিমাণে নষ্ট মেমোরির পরিমাণ যোগ করতে পারে)।

"খারাপ অভ্যাস" সম্পর্কিত:

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


1
10x উচ্চতর তুলনায় কি ? যদি আমার একটি ইনস্টল্ট ফিল্ড হিসাবে ডিফল্ট-নির্মান অ্যারেলিস্ট থাকে (এটি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হওয়ার পরিবর্তে) তবে আমি আসলে কিছুটা বেশি মেমরি ব্যবহার করছি যেহেতু আমার অবজেক্টে অতিরিক্ত পয়েন্টার-থেকে-অ্যারেলিস্ট সংরক্ষণ করতে হবে। এমনকি যদি আমরা কমলাগুলির সাথে আপেল তুলনা করি এবং অ্যারেলিস্ট থেকে উত্তরাধিকার সূত্রে কোনও অ্যারেলিস্ট ব্যবহার না করে তুলনা করি তবে নোট করুন যে জাভাতে আমরা সর্বদা অবজেক্টের সাথে পয়েন্টার নিয়ে কাজ করি, সি -+ এর মতো মান অনুসারে কখনই বস্তু হয় না। new Object[0]মোট চারটি শব্দের ব্যবহার ধরে new Object[10]নিলে এটি কেবল 14 টি মেমরির ব্যবহার করবে।
আমন

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

-2

এটি যৌগিক প্যাটার্নের সিনেমিকের মতো দেখাচ্ছে বলে মনে হচ্ছে । এটি পুনরাবৃত্তির ডেটাস্ট্রাকচারের মডেল করতে ব্যবহৃত হয়।


13
আমি এটিকে কম করব না, তবে এ কারণেই আমি সত্যিই জিওএফ বইটিকে ঘৃণা করি । এটি একটি রক্তাক্ত গাছ! গাছ বর্ণনার জন্য আমাদের কেন "যৌগিক নিদর্শন" শব্দটি আবিষ্কার করার দরকার হয়েছিল?
ডেভিড আরনো

3
@ ডেভিড আর্নো আমি বিশ্বাস করি এটি সম্পূর্ণ পলিমারফিক-নোড দিক যা এটি "সংমিশ্রণ প্যাটার্ন" হিসাবে সংজ্ঞায়িত করে, একটি বৃক্ষের ডেটা কাঠামোর ব্যবহার এর অংশ মাত্র।
জ্যাব

2
@ রবার্ট হার্ভে, আমি একমত নই (আপনার উত্তর সম্পর্কে এবং আপনার মন্তব্য উভয়ের সাথে) public class Node extends ArrayList<Node> { public string Item; }আপনার উত্তরের উত্তরাধিকার সংস্করণ। আপনার পক্ষে যুক্তি করা সহজ, তবে উভয়ই কিছু অর্জন করে: তারা নন-বাইনারি গাছগুলি সংজ্ঞায়িত করে।
ডেভিড আরনো

2
@ ডেভিড আর্নো: আমি কখনই বলিনি যে এটি কার্যকর হবে না, আমি কেবল বলেছিলাম এটি সম্ভবত আদর্শ নয়।
রবার্ট হার্ভে

1
@ ডেভিড আর্নো এটি এখানে অনুভূতি এবং স্বাদ সম্পর্কে নয়, তবে এটি তথ্য সম্পর্কে। একটি গাছ নোড দিয়ে তৈরি এবং প্রতিটি নোডে সম্ভাব্য শিশু রয়েছে। প্রদত্ত নোড হল একটি নির্দিষ্ট মুহুর্তে একটি পাতার নোড। সংমিশ্রণে, একটি লিফ নোড নির্মাণ দ্বারা পাতা হয় এবং এর প্রকৃতি পরিবর্তন হয় না।
ক্রিস্টোফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.