নতুন জিনিসগুলি সংরক্ষণ না করে তৈরি করা কি খারাপ অভ্যাস?


23

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

new Shell();

এই নতুন শেল অবজেক্টটি কোনও ভেরিয়েবলে সংরক্ষণ করা হয়নি, তবে উইন্ডোটি বন্ধ হয়ে যাওয়ার পরে উইন্ডোটি নিষ্পত্তি না হওয়া অবধি রেফারেন্স থাকবে [যা আমি বিশ্বাস করি?] ডিফল্টরূপে উইন্ডোটি বন্ধ হয়ে যায় happens

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

হালনাগাদ:

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

(new HelloThread()).start();

এই অনুশীলনটি অনেক প্রসঙ্গে দেখা যায়, তাই প্রশ্নগুলি রয়ে গেছে। এটা কি ভাল অনুশীলন?


2
রেফারেন্সটি স্টোর করার বিষয়টি কী হবে?
ড্যানিয়েল আর হিকস

(এটা সম্ভবত ভাল হবে, একটি দেখুন ধারণাগত বিন্দু থেকে যেমন একটি স্ট্যাটিক পদ্ধতি আছে Shell.createTopLevelShell()বা যাই হোক না কেন, বনাম এই ক্ষেত্রে একটি কন্সট্রাকটর ব্যবহার করে কিন্তু বৈশিষ্ট্যগুলি সামান্য পার্থক্য।।)
ড্যানিয়েল আর Hicks আপনি

এই প্রশ্নটি বস্তুগুলি তাদের উল্লেখ না করে তৈরি করার অনুশীলন সম্পর্কে, এই অনুশীলনের প্রয়োজন এমন শ্রেণি তৈরি করা, বা এটি কীভাবে বিশেষত SWT এই ধরণের প্যাটার্নটি ব্যবহার করে?
স্ট্রিপলিং ওয়ারিয়র

1
এসডাব্লুটি অবজেক্টগুলি অবশ্যই dispose()ডি: নিয়ম 1: আপনি এটি তৈরি করলে আপনি তা নিষ্পত্তি করে দিন। eclipse.org/articles/swt-design-2/swt-design-2.html
jbindel

2
আমি ডিবাগিংয়ের উদ্দেশ্যে একটি রেফারেন্স ধরে রাখতে একটি পরিবর্তনক ব্যবহার করব। আপনার যদি এই পদ্ধতিতে ব্রেক পয়েন্ট থাকে তবে আপনি স্থানীয় ভেরিয়েবলের মাধ্যমে ডিবাগারটি অবজেক্টটি জিজ্ঞাসা করতে পারেন। রেফারেন্স ছাড়া আমি নিশ্চিত যে এটি সম্ভব তবে সম্ভবত আরও কঠিন।
মার্টিন ইয়র্ক

উত্তর:


12

এটিতে ব্যক্তিগত পছন্দের একটি উপাদান রয়েছে তবে আমি মনে করি যে রেফারেন্সটি সংরক্ষণ না করা অবশ্যই খারাপ অভ্যাস নয়।

নিম্নলিখিত অনুমানমূলক উদাহরণ বিবেচনা করুন:

new SingleFileProcessor().process(file);

যদি প্রতিটি ফাইলের জন্য একটি নতুন প্রসেসর অবজেক্ট তৈরি করা প্রয়োজন হয়, এবং process()কল করার পরেও প্রয়োজন হয় না , তবে এটির একটি রেফারেন্স সংরক্ষণ করার কোনও মানে নেই।

এখানে জাভা সম্মতি টিউটোরিয়াল থেকে নেওয়া অন্য উদাহরণ :

(new HelloThread()).start();

রেফারেন্সটি সংরক্ষণ না করা অবস্থায় আমি প্রচুর অন্যান্য উদাহরণ দেখেছি এবং এটি আমার চোখে পুরোপুরি সূক্ষ্মভাবে পড়েছে যেমন:

String str = new StringBuilder().append(x).append(y).append(z).toString();

( StringBuilderঅবজেক্টটি রাখা হয়নি।)

কমন.ল্যাং এর HashCodeBuilderএবং অন্যান্য জড়িত অনুরূপ নিদর্শন রয়েছে ।


2
@ বালুসসি: শ্রদ্ধার সাথে, আমি দেখতে পাচ্ছি না যে এটিকে কী কী মাছধরা করে তোলে এবং কীভাবে কারখানার পদ্ধতি থাকা ভাল (আমি মনে করি যে আপনার উদাহরণটি আমার সাথে সাদৃশ্যপূর্ণ, এবং getInstance()এটি একটি কারখানা এবং একক নয়))
এনপিই

সিঙ্গেলটন ব্যবহার করবেন কিনা তা কারখানার উপর নির্ভর করে। কারখানার কলকারীকে এ সম্পর্কে খুব বেশি ভাবা উচিত নয়।
ডোনাল ফেলো

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

@ বালুসসি: ফাইলপ্রসেসরের আচরণ পরিবর্তন করতে অতিরিক্ত পদ্ধতি থাকতে পারে process
কেভিন

7

আপনার যদি তৈরি করা অবজেক্টের রেফারেন্সের প্রয়োজন না হয় , তবে রেফারেন্সটি ধরে রাখবেন না। এটা ঐটার মতই সহজ.


5

সাধারণভাবে, রেফারেন্সগুলি যত তাড়াতাড়ি যুক্তিসঙ্গতভাবে মুক্তি পেতে পারে তত দ্রুত প্রকাশ করা ভাল অনুশীলন। আমি এর মধ্যে কোনও পার্থক্য দেখছি না:

HelloThread thread = new HelloThread();
thread.start();
// where thread is never used for the rest of the method

এবং

(new HelloThread()).start();

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

কনস্ট্রাক্টর অ্যান্টি-প্যাটার্নের কোডটি এড়াতে আসল একমাত্র আসল সমস্যা , তবে আপনি যা চাইছেন তা মনে হচ্ছে না।


3

আপনি যদি SWT ব্যবহার করেন তবে এটি খারাপ হতে পারে, কারণ সেখানে আপনাকে নিজের পরে পরিষ্কার করতে হবে (নিষ্পত্তি () পদ্ধতিটি কল করা)। তবে অন্যান্য ক্লাসের জন্য (এসডাব্লুটিবিহীন) এটি ঠিক আছে।

অপারেটিং সিস্টেম রিসোর্স পরিচালনা সম্পর্কে একটি নিবন্ধ এখানে


বিজ্ঞপ্তি সংক্রান্ত রেফারেন্সগুলি জাভাগুলিতে আবর্জনা সংগ্রহ করতে বাধা দেয় না। যে কোনও আধুনিক জাভা ভিএম নির্ধারণ করে যে বস্তুগুলি তাদের কাছে পৌঁছনীয় কিনা এবং তার ভিত্তিতে রেফারেন্স গণনা ব্যবহার করে না তা GCable কিনা।
jbindel

2
প্রকৃতপক্ষে এটি রেফারেন্স গণনা ব্যবহার করে না। তবে এসডাব্লুটিটি একটি বিশেষ কেস যেখানে আমাদের ডিসপোজ () কল করতে হবে, যদিও প্রথমে কোনও রক্ষণাবেক্ষণ () কল করার দরকার নেই।
অ্যালেক্স

আমি কেবল নন-এসডব্লিউটি কেসকেই বোঝাতে চাইছি।
jbindel

অপারেটিং সিস্টেম রিসোর্স পরিচালনা সম্পর্কে একটি নিবন্ধ এখানে eclipse.org/articles/swt-design-2/swt-design-2.html
অ্যালেক্স

2
সেক্ষেত্রে "জিসির পক্ষে অসম্ভব" সম্পর্কিত বিবৃতিটি বিভ্রান্তিকর হওয়ায় সরানোর জন্য আপনার উত্তরটি সম্পাদনা করুন।
ডোনাল ফেলো

1

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

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

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


2
অন্যান্য ভাষা থেকে বিরক্তিকর প্রোগ্রামারদের সম্পর্কে চিন্তা করা কি প্রথম উদ্বেগের বিষয়?
বাটনস 840

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