উত্তর:
এটির সাথে একমাত্র সমস্যা হ'ল এটি আপনার স্থানীয় নেমস্পেসকে বিশৃঙ্খলা করে। উদাহরণস্বরূপ, ধরা যাক যে আপনি একটি সুইং অ্যাপ্লিকেশন লিখছেন, এবং তাই প্রয়োজন java.awt.Event
, এবং সংস্থার কোম্পানির ক্যালেন্ডারিং সিস্টেমের সাথেও হস্তক্ষেপ করছেন com.mycompany.calendar.Event
। আপনি যদি ওয়াইল্ডকার্ড পদ্ধতি ব্যবহার করে উভয়ই আমদানি করেন তবে এই তিনটি জিনিসের মধ্যে একটি ঘটে:
java.awt.Event
এবং এর মধ্যে একেবারে নামকরণ বিরোধ রয়েছে com.mycompany.calendar.Event
এবং তাই আপনি সংকলন করতেও পারবেন না।.*
) তবে এটি ভুল,com.mycompany.calendar.Event
, তবে পরে তারা যখন একটি যুক্ত করে তখন আপনার আগের বৈধ কোডটি হঠাৎ করে সংকলন বন্ধ করে দেয়।সমস্ত আমদানি স্পষ্টভাবে তালিকাভুক্ত করার সুবিধাটি হ'ল আমি এক নজরে বলতে পারি আপনি কোন শ্রেণিটি ব্যবহার করতে চেয়েছিলেন, যা কেবল কোডটি পড়া এত সহজ করে তোলে। আপনি যদি কেবল একটি দ্রুত একক কাজ করেন, তবে স্পষ্টতই ভুল কিছু নেই , তবে ভবিষ্যতের রক্ষণাবেক্ষণকারীরা অন্যথায় অন্যথায় আপনার স্পষ্টতার জন্য আপনাকে ধন্যবাদ জানাবে।
তারকা আমদানির জন্য এখানে একটি ভোট । একটি আমদানি বিবৃতি কোনও প্যাকেজ আমদানির উদ্দেশ্যে , কোনও শ্রেণি নয়। এটি সম্পূর্ণ প্যাকেজগুলি আমদানি করতে অনেক ক্লিনার; এখানে চিহ্নিত সমস্যাগুলি (যেমন java.sql.Date
বনাম java.util.Date
) সহজেই অন্যান্য উপায়ে প্রতিকার করা হয়, নির্দিষ্ট আমদানির দ্বারা সত্যই সমাধান করা যায় না এবং অবশ্যই অবশ্যই সমস্ত শ্রেণীর মধ্যে উন্মাদভাবে পেডেন্টিক আমদানিকে ন্যায়সঙ্গত করে না। একটি উত্স ফাইল খোলার এবং 100 টি আমদানির বিবরণীর মাধ্যমে পৃষ্ঠাতে থাকা ছাড়া আর কোনরকম উদ্বেগজনক কিছু নেই।
নির্দিষ্ট আমদানি করা রিফ্যাক্টরিংকে আরও কঠিন করে তোলে; আপনি যদি কোনও শ্রেণি অপসারণ / পুনরায় নামকরণ করেন তবে আপনাকে তার নির্দিষ্ট নির্দিষ্ট আমদানি সরিয়ে ফেলতে হবে । আপনি যদি একই প্যাকেজের কোনও পৃথক শ্রেণিতে একটি বাস্তবায়ন পরিবর্তন করেন, আপনাকে আমদানিগুলি ঠিক করতে হবে। এই অতিরিক্ত পদক্ষেপগুলি স্বয়ংক্রিয়ভাবে চালিত হতে পারে তবে এগুলি সত্যই কোনও লাভের জন্য উত্পাদনশীলতা হিট।
এমনকি ডিগ্রি অনুসারে যদি Eclipse ক্লাস আমদানি না করে, তবুও প্রত্যেকে স্টার আমদানি করবে। আমি দুঃখিত, তবে সুনির্দিষ্ট আমদানি করার কোনও যুক্তিসঙ্গত যৌক্তিকতা নেই।
শ্রেণিবদ্ধদের মোকাবেলা করার উপায় এখানে:
import java.sql.*;
import java.util.*;
import java.sql.Date;
Foo
এবং আমি যদি কোনও আইডিই ব্যবহার না করেই আপনার কোডটি পড়ি (যেহেতু আপনার যুক্তিটি হ'ল আমার কোনও ব্যবহার করা উচিত নয়) তবে আমি কীভাবে জানব যে কোন প্যাকেজটি Foo
এসেছে? ? অবশ্যই, একটি আইডিই ব্যবহার করে, আইডিই আমাকে বলবে, তবে আপনার সম্পূর্ণ যুক্তিটি হ'ল আমার কোনওটি ছাড়াই কোডটি পড়তে সক্ষম হওয়া উচিত । সুস্পষ্ট আমদানি করা কোডটি দস্তাবেজকে সহায়তা করে (ওয়াইল্ডকার্ডগুলি এড়ানোর দুর্দান্ত কারণ) , এবং এটির অনেক বেশি সম্ভাবনা রয়েছে যে আমি আইডিই ব্যবহার না করেই কোডটি পড়ছি , তার চেয়ে আমি কোনও আইডিই ব্যবহার না করেই কোডটি লিখছি ।
দয়া করে দেখুন আমার নিবন্ধটি ডিমান্ড এ ডিমান্ড এভিল
সংক্ষেপে, সবচেয়ে বড় সমস্যা হ'ল আপনার আমদানি করা প্যাকেজটিতে কোনও শ্রেণি যুক্ত করা হলে আপনার কোডটি ভেঙে যেতে পারে। উদাহরণ স্বরূপ:
import java.awt.*;
import java.util.*;
// ...
List list;
জাভা 1.1 এ, এটি ঠিক ছিল; তালিকা java.awt এ পাওয়া গেছে এবং কোনও বিরোধ নেই।
এখন ধরা যাক আপনি আপনার পুরোপুরি কার্যকরী কোডটি যাচাই করেছেন এবং এক বছর পরে অন্য কেউ এটি সম্পাদনা করার জন্য এনেছে এবং জাভা 1.2 ব্যবহার করছে।
জাভা ১.২ জাভা.ইটিলে লিস্ট নামের একটি ইন্টারফেস যুক্ত করেছে। গম্ভীর গর্জন! সংঘর্ষ। নিখুঁতভাবে কাজ করার কোডটি আর কাজ করে না।
এটি একটি ইভিল ভাষার বৈশিষ্ট্য। কোনও প্যাকেজে টাইপ যুক্ত হওয়ার কারণে কোডটি সংকলন বন্ধ করা উচিত বলে কোনও কারণ নেই ...
তদতিরিক্ত, আপনি কোন "ফু" ব্যবহার করছেন তা নির্ধারণ করা পাঠকের পক্ষে জটিল করে তোলে
java.util.List
বনামটি বের java.awt.List
করা খুব খারাপ নয়, তবে শ্রেণীর নাম Configuration
এবং একাধিক নির্ভরতা গ্রন্থাগারগুলি এটি তাদের সর্বশেষতম মেভেন রেপো সংস্করণে যুক্ত করার পরে চেষ্টা করে দেখুন।
এটা না একটি জাভা আমদানি বক্তব্যের সঙ্গে একটি বন্য কার্ড ব্যবহার করতে খারাপ।
ইন ক্লিন কোড , রবার্ট সি মার্টিন আসলে তাদের ব্যবহার করার পরামর্শ দীর্ঘ আমদানি তালিকা এড়ানো।
সুপারিশটি এখানে:
জে 1: ওয়াইল্ডকার্ড ব্যবহার করে দীর্ঘ আমদানি তালিকা এড়ান
আপনি যদি কোনও প্যাকেজ থেকে দুটি বা ততোধিক ক্লাস ব্যবহার করেন তবে পুরো প্যাকেজটি দিয়ে আমদানি করুন
আমদানি প্যাকেজ। *;
আমদানির দীর্ঘ তালিকা পাঠকদের কাছে হতাশ করছে। আমরা 80 লাইন আমদানি সহ আমাদের মডিউলগুলির শীর্ষগুলি ছড়িয়ে দিতে চাই না। বরং আমরা চাই আমদানিগুলি কী প্যাকেজগুলির সাথে আমরা সহযোগিতা করি সে সম্পর্কে একটি সংক্ষিপ্ত বিবৃতি হোক।
নির্দিষ্ট আমদানিগুলি হার্ড নির্ভরতা, যেখানে ওয়াইল্ডকার্ড আমদানি হয় না। আপনি যদি নির্দিষ্টভাবে কোনও শ্রেণি আমদানি করেন তবে অবশ্যই সেই শ্রেণীর উপস্থিতি থাকতে হবে। তবে আপনি যদি ওয়াইল্ডকার্ড সহ কোনও প্যাকেজ আমদানি করেন তবে কোনও নির্দিষ্ট শ্রেণীর উপস্থিতির প্রয়োজন নেই। নাম অনুসন্ধানের সময় আমদানি বিবরণী অনুসন্ধান প্যাকেজে কেবল প্যাকেজ যুক্ত করে। সুতরাং এই জাতীয় আমদানি দ্বারা কোনও সত্য নির্ভরতা তৈরি হয় না এবং তারা আমাদের মডিউলগুলি কম সংযুক্ত রাখার জন্য পরিবেশন করে।
কিছু সময় আছে যখন নির্দিষ্ট আমদানির দীর্ঘ তালিকা কার্যকর হতে পারে। উদাহরণস্বরূপ, যদি আপনি লিগ্যাসি কোড নিয়ে কাজ করে থাকেন এবং আপনি কী ক্লাসগুলির জন্য মক এবং স্টাবগুলি তৈরি করতে চান তা জানতে চান তবে আপনি এই সমস্ত শ্রেণীর সত্যিকারের যোগ্য নামগুলি খুঁজে পেতে নির্দিষ্ট আমদানির তালিকায় যেতে পারেন এবং তারপরে লিখতে পারেন জায়গায় উপযুক্ত stubs। যাইহোক, নির্দিষ্ট আমদানির জন্য এই ব্যবহার খুব বিরল। তদুপরি, বেশিরভাগ আধুনিক আইডিই আপনাকে ওয়াইল্ড কার্ডেড আমদানিগুলিকে একক কমান্ডের সাহায্যে নির্দিষ্ট আমদানির তালিকায় রূপান্তর করতে দেয়। সুতরাং এমনকি উত্তরাধিকারের ক্ষেত্রে ওয়াইল্ডকার্ড আমদানি করা আরও ভাল।
ওয়াইল্ডকার্ড আমদানি কখনও কখনও নামের দ্বন্দ্ব এবং অস্পষ্টতার কারণ হতে পারে। একই নামের দুটি ক্লাস, তবে বিভিন্ন প্যাকেজগুলিতে, বিশেষভাবে আমদানি করা প্রয়োজন, বা ব্যবহারের সময় কমপক্ষে নির্দিষ্টভাবে যোগ্যতা অর্জন করতে হবে। এটি একটি উপদ্রব হতে পারে তবে যথেষ্ট বিরল যে ওয়াইল্ডকার্ড আমদানি ব্যবহার নির্দিষ্ট নির্দিষ্ট আমদানির চেয়ে এখনও ভাল।
পারফরম্যান্স : বাইট কোড হিসাবে পারফরম্যান্সে কোনও প্রভাব নেই। যদিও এটি কিছু সংকেত ওভারহেডের দিকে নিয়ে যাবে।
সংকলন : আমার ব্যক্তিগত মেশিনে, কিছু আমদানি না করে ফাঁকা ক্লাস সংকলন করতে জাভা আমদানি করার সময় ১০০ এমএস তবে একই শ্রেণি লাগে * * 170 এমএস লাগে।
import java.*
আমদানি কিছুই। কেন এটি একটি পার্থক্য করতে হবে?
এটি আপনার নেমস্পেসকে বিশৃঙ্খলাবদ্ধ করে তোলে, আপনাকে দ্বিপাক্ষিক যে কোনও ক্লাসের নাম সম্পূর্ণরূপে নির্দিষ্ট করতে হবে। এর সর্বাধিক সাধারণ ঘটনাটি হ'ল:
import java.util.*;
import java.awt.*;
...
List blah; // Ambiguous, needs to be qualified.
এটি আপনার নির্ভরতাগুলি কংক্রিট করতে সহায়তা করে, কারণ আপনার সমস্ত নির্ভরতা ফাইলের শীর্ষে তালিকাভুক্ত করা হয়।
বেশিরভাগ জায়গাতেই আমি কাজ করেছি যা কোনও উল্লেখযোগ্য পরিমাণ জাভা ব্যবহার করে সুস্পষ্ট আমদানি কোডিং স্ট্যান্ডার্ডের অংশ করে তোলে। কোডটি উত্পাদনের সময় আমি মাঝে মাঝে ততক্ষণে দ্রুত প্রোটোটাইপিংয়ের জন্য * ব্যবহার করি এবং তারপরে আমদানি তালিকাগুলি প্রসারিত করি (কিছু আইডিই আপনার জন্য এটিও করবে)।
পূর্ববর্তী একটি প্রকল্পে আমি দেখতে পেয়েছিলাম যে * - আমদানি থেকে নির্দিষ্ট আমদানিতে পরিবর্তন সংকলনের সময়টিকে অর্ধেক (প্রায় 10 মিনিট থেকে প্রায় 5 মিনিটে) হ্রাস করে। * -Import আপনার ব্যবহৃত একটির সাথে ক্লাসের জন্য তালিকাভুক্ত প্রতিটি প্যাকেজ সংকলক অনুসন্ধান করে। যদিও এই সময়টি ছোট হতে পারে, এটি বড় প্রকল্পগুলির জন্য যোগ করে।
* -Import এর একটি পার্শ্ব প্রতিক্রিয়া ছিল হ'ল ডেভেলপাররা সাধারণ কী আমদানি লাইনগুলি তাদের প্রয়োজন তা ভেবে কপি এবং পেস্ট করবে।
ইন DDD বই
যে কোনও উন্নয়ন প্রযুক্তির প্রয়োগ বাস্তবায়নের উপর ভিত্তি করে তৈরি করা হবে, মোডিয়ুলগুলি সংশোধন করার কাজটি কমানোর উপায়গুলি সন্ধান করুন। জাভাতে, পৃথক শ্রেণিতে আমদানি করা থেকে রেহাই পাওয়া যায় না, তবে প্যাকেজগুলি একসাথে একত্রে একত্রে থাকা প্যাকেজগুলি একই সাথে প্যাকেজের নাম পরিবর্তনের প্রচেষ্টা হ্রাস করার উদ্দেশ্যে এই প্রতিচ্ছবিটি প্রতিফলিত করে আপনি একবারে কমপক্ষে পুরো প্যাকেজগুলি আমদানি করতে পারেন।
এবং যদি এটি স্থানীয় নামফলকে বিশৃঙ্খলা করে তবে এটি আপনার দোষ নয় - প্যাকেজের আকারটিকে দোষ দিন।
কোনও রানটাইম প্রভাব নেই, কারণ সংকলক স্বয়ংক্রিয়ভাবে * কে কংক্রিট শ্রেণীর নামের সাথে প্রতিস্থাপন করে। আপনি .class ফাইলটি ডিসম্পাইল করে ফেললে আপনি কখনই দেখতে পাবেন না import ...*
।
সি # সর্বদা * ব্যবহার করে (অন্তর্নিহিত) কারণ আপনি কেবল using
প্যাকেজ নাম রাখতে পারেন। আপনি কখনই শ্রেণীর নাম নির্দিষ্ট করতে পারবেন না। জাভা সি # এর পরে বৈশিষ্ট্যটি প্রবর্তন করে। (জাভা অনেক দিক থেকে জটিল, তবে এটি এই বিষয়টির বাইরে)।
ইন্টেলিজ আইডিয়ায় আপনি যখন "আমদানি সংগঠিত" করেন, এটি স্বয়ংক্রিয়ভাবে একই প্যাকেজের একাধিক আমদানিকে * এর সাথে প্রতিস্থাপন করে। আপনি এটি বন্ধ করতে না পারার কারণে এটি একটি বাধ্যতামূলক বৈশিষ্ট্য (যদিও আপনি প্রান্তিক বৃদ্ধি করতে পারেন)।
গৃহীত উত্তর দ্বারা তালিকাভুক্ত মামলাটি বৈধ নয়। * ছাড়া আপনি এখনও একই সমস্যা পেয়েছেন। আপনি আপনার কোডটিতে প্যাকেজের নামটি নির্দিষ্ট করতে হবে আপনি যা ব্যবহার করেন না * তা ব্যবহার করুন।
রেকর্ডের জন্য: আপনি যখন কোনও আমদানি যুক্ত করবেন, আপনি নিজের নির্ভরতাও ইঙ্গিত করছেন।
আপনি ফাইলগুলির নির্ভরতা কী তা দ্রুত দেখতে পেলেন (একই নেমস্পেসের ক্লাসগুলি বাদ দিয়ে)।
সর্বাধিক গুরুত্বপূর্ণটি হ'ল আমদানি করা java.awt.*
আপনার প্রোগ্রামকে ভবিষ্যতের জাভা সংস্করণের সাথে বেমানান করতে পারে:
মনে করুন আপনার "ABC" নামে একটি শ্রেণি রয়েছে, আপনি জেডিকে 8 ব্যবহার করছেন এবং আপনি আমদানি করেন java.util.*
। এখন, ধরুন যে জাভা 9 বেরিয়ে এসেছে এবং এটির প্যাকেজে একটি নতুন ক্লাস রয়েছে java.util
যা কাকতালীয়ভাবে "এবিসি" নামে পরিচিত। আপনার প্রোগ্রামটি এখন জাভা 9 তে সংকলন করবে না, কারণ সংকলক জানেন না যে "এবিসি" নামের সাথে আপনি নিজের শ্রেণি বা নতুন ক্লাসটি বোঝাচ্ছেনjava.awt
।
আপনি কেবল সেই ক্লাসগুলি স্পষ্টভাবে আমদানি করলে আপনার সমস্যা হবে না java.awt
।
সম্পদ:
Stream
জাভাতে জাভাতে যোগ করা নতুন ক্লাসের উদাহরণ হিসাবে জাভা 8 ব্যবহার করতে পারবেন ...
উভয় পক্ষের তৈরি সমস্ত বৈধ পয়েন্টগুলির মধ্যে আমি ওয়াইল্ডকার্ড এড়ানোর জন্য আমার মূল কারণটি খুঁজে পাইনি: আমি কোডটি পড়তে এবং প্রতিটি শ্রেণিটি কী তা সরাসরি জানতে সক্ষম হতে চাই, বা যদি এর সংজ্ঞাটি ভাষাতে না হয় বা ফাইলটি, এটি কোথায় সন্ধান করতে হবে। যদি একাধিক প্যাকেজ * এর সাথে আমদানি করা হয় তবে আমি স্বীকৃত না এমন একটি ক্লাস খুঁজতে আমাকে তাদের প্রত্যেককে অনুসন্ধান করতে হবে। পঠনযোগ্যতা সর্বোচ্চ, এবং আমি সম্মত হই যে কোডটি পড়ার জন্য কোনও আইডিই প্রয়োজন হবে না ।