Init () পদ্ধতিগুলি কি কোনও কোডের গন্ধযুক্ত?


20

কোনও init()প্রকারের জন্য কোনও পদ্ধতি ঘোষণা করার কোনও উদ্দেশ্য আছে কি ?

আমি কোন কনস্ট্রাক্টরের চেয়ে আমাদের পছন্দ init()করা উচিত বা কীভাবে ঘোষণা এড়ানো init()যায় সে বিষয়ে জিজ্ঞাসা করছি না ।

আমি জিজ্ঞাসা করছি যে কোনও পদ্ধতি ঘোষণার পিছনে কোনও যুক্তি আছে init()(এটি কতটা সাধারণ বিষয় তা দেখে) বা এটি কোনও কোডের গন্ধ এবং এড়ানো উচিত।


init()বাগ্ধারা খুবই সাধারণ, কিন্তু আমি এখনো কোনো বাস্তব সুবিধা দেখতে আছে।

আমি এমন ধরণের কথা বলছি যা কোনও পদ্ধতির মাধ্যমে সূচনাটি উত্সাহিত করে:

class Demo {
    public void init() {
        //...
    }
}

কখন এই উত্পাদন কোড ব্যবহার করা হবে?


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

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


1
"... এটি কতটা সাধারণ তা দেখে ...": এটি কি সাধারণ? আপনি কিছু উদাহরণ দিতে পারেন? সম্ভবত আপনি এমন একটি কাঠামো নিয়ে কাজ করছেন যার জন্য পৃথকীকরণ এবং নির্মাণ পৃথক করা প্রয়োজন।
আসুন

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

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

আপনি আগ্রহী হতে পারে।
-এই

উত্তর:


39

হ্যাঁ, এটি একটি কোড গন্ধ। একটি কোড গন্ধ এমন কিছু নয় যা অগত্যা সর্বদা অপসারণ করা দরকার। এটি এমন একটি জিনিস যা আপনাকে দ্বিতীয় দর্শন নিতে বাধ্য করে।

এখানে আপনার দুটি মৌলিকভাবে পৃথক অবস্থায় রয়েছে: প্রাক-আরম্ভ এবং পোস্ট-ইন। এই সমস্ত রাজ্যের বিভিন্ন দায়িত্ব রয়েছে, বিভিন্ন পদ্ধতি যা ডাকে মঞ্জুরিপ্রাপ্ত এবং বিভিন্ন আচরণ রয়েছে। এটি কার্যকরভাবে দুটি পৃথক ক্লাস।

আপনি যদি শারীরিকভাবে তাদের দুটি পৃথক শ্রেণি তৈরি করেন তবে আপনি সম্ভাব্য বাগগুলির পুরো শ্রেণিকে স্থিতিশীলভাবে সরিয়ে ফেলবেন, সম্ভবত আপনার মডেলটিকে "রিয়েল ওয়ার্ল্ড মডেল" এর সাথে খুব ঘনিষ্ঠভাবে মেলে না এমন ব্যয় করে। আপনি সাধারণতঃ প্রথম এক নাম Configবা Setupবা ওই জাতীয় কিছু।

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


6
দ্বি-শ্রেণীর মডেলটি চেষ্টা করার জন্য আপনার পরামর্শটি ভাল। কোড-গন্ধের সমাধানের জন্য একটি কংক্রিট পদক্ষেপের প্রস্তাব কার্যকর।
ইভান

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

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

14

এটা নির্ভর করে.

কোনও initপদ্ধতি হ'ল একটি কোড গন্ধ যখন কনস্ট্রাক্টর থেকে অবজেক্ট ইনিশিয়ালেশন পৃথক করা প্রয়োজন হয় না। কখনও কখনও এমন ঘটনা রয়েছে যেখানে এই পদক্ষেপগুলি পৃথক করে দেওয়া বুদ্ধিমান।

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

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


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

@VinceEmigh: ঠিক আছে, এটি প্রথম উদাহরণ আমি এখানে দঃপূঃ platfform উপর খুঁজে পাইনি, হয়তো না করাই ভাল ছিল, কিন্তু সেখানে আছে একটি আলাদা জন্য বৈধ ব্যবহারের ক্ষেত্রে initপদ্ধতি। যাইহোক, আপনি যখনই এই জাতীয় কোনও পদ্ধতি দেখেন তবে তার প্রয়োজনীয়তা সম্পর্কে নির্দ্বিধায় প্রশ্ন করুন।
ডক ব্রাউন

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

1
@ ভিনসেমিঃ: আপনি যখন এ জাতীয় পরিস্থিতিটি ভাবতে না পারেন, আপনার কল্পনার উপর কাজ করা দরকার ;-)। বা আমার উত্তরটি আবার পড়ুন, এটিকে কেবল "বরাদ্দ" -তে কমাবেন না। অথবা বিভিন্ন বিক্রেতাদের আরও ফ্রেমওয়ার্ক নিয়ে কাজ করুন।
ডক ব্রাউন

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

5

আমার অভিজ্ঞতা দুটি গ্রুপে বিভক্ত:

  1. কোড যেখানে init () আসলে প্রয়োজনীয়। এটি তখন ঘটতে পারে যখন কোনও সুপার ক্লাস বা ফ্রেমওয়ার্ক আপনার শ্রেণীর নির্মাতাকে নির্মাণের সময় তার সমস্ত নির্ভরতা পেতে বাধা দেয়।
  2. কোড যেখানে init () ব্যবহৃত হয় তবে তা এড়ানো যেত।

আমার ব্যক্তিগত অভিজ্ঞতায় আমি (1) এর কয়েকটি কয়েকটি উদাহরণ দেখেছি (2) এর আরও অনেক উদাহরণ। ফলস্বরূপ, আমি সাধারণত একটি init () একটি কোড-গন্ধ বলে ধরে নিই, তবে এটি সবসময় হয় না। কখনও কখনও আপনি এটি কাছাকাছি পেতে পারেন না।

আমি বিল্ডার প্যাটার্নটি ব্যবহার করে প্রায়শই একটি দীক্ষা নেওয়ার প্রয়োজনীয়তা / আকাঙ্ক্ষা দূর করতে সহায়তা করতে পারি found


1
যদি একটি সুপারক্লাস বা কাঠামো কোনও প্রকারের কনস্ট্রাক্টরের মাধ্যমে প্রয়োজনীয় নির্ভরতা অর্জন করতে দেয় না তবে কোনও init()পদ্ধতি যুক্ত করে কীভাবে এটি সমাধান করবে? init()পদ্ধতি পারেন নির্ভরতা গ্রহণ করতে পরামিতি হবে, অথবা আপনি নির্ভরতা instantiate আছে চাই মধ্যেinit() পদ্ধতি, যা আপনি একটি কন্সট্রাকটর সঙ্গে কাজ করতে পারে। আপনি একটি উদাহরণ দিতে পারেন?
ভিন্স এমি

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

1

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

সংক্ষিপ্তসার হিসাবে: সেখানে বেশিরভাগ দ্বিধাদ্বন্দ্বের জন্য, এটি কোডের গন্ধ কিনা তা পরিস্থিতি এবং পরিস্থিতির উপর নির্ভর করে।


কনফিগারেশন আপডেট, এবং এই পুনরায় সেট করতে বস্তুর প্রয়োজন হয় / কনফিগারেশনের উপর ভিত্তি করে এটা অবস্থা পরিবর্তন, আপনি তা মনে করি না এটা ভাল একটি যেমন বস্তুর আইন আছে হবে পর্যবেক্ষক প্রতি Config?
ভিন্স এমি

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

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

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

1

আপনি এগুলি কীভাবে ব্যবহার করেন তার উপর নির্ভর করে।

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

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

সাধারণত যদিও এটি একটি কোড গন্ধ।


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

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

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

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

1

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

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

এই জাতীয় কেসগুলি বাদে আমি মনে করি সবকিছুই একটি কনস্ট্রাক্টরের মধ্যে .ুকতে হবে।


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

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

0

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

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


0

ডিগ্র () - পদ্ধতিটি বস্তুর রাজ্য-জীবনচক্রটিতে শব্দার্থভাবে এমবেড করা থাকলে কোনও কোডের গন্ধ নেই।

যদি আপনাকে অবজেক্টটিকে সামঞ্জস্য অবস্থায় রাখতে কল করতে () কল করতে হয় তবে এটি একটি কোড গন্ধ।

এই জাতীয় কাঠামো বিদ্যমান রয়েছে এমন বেশ কয়েকটি প্রযুক্তিগত কারণ রয়েছে:

  1. কাঠামো হুক
  2. প্রাথমিক অবস্থায় অবজেক্টটিকে পুনরায় সেট করা (অপ্রয়োজনীয়তা এড়ানো)
  3. পরীক্ষার সময় ওভাররাইডের সম্ভাবনা

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

মুল বক্তব্যটি হ'ল আপনি আর ডি পদ্ধতিটি কল করার আগে অবজেক্টটি ব্যবহারযোগ্য হতে হবে। এটি ডাকা হওয়ার পরে অন্য কোনও উপায়ে হতে পারে। রাষ্ট্রের প্যাটার্ন দেখুন। আংশিক বস্তু নির্মাণের অর্থে এটি একটি কোড গন্ধ।
oopexpert

-4

নাম init কখনও কখনও অস্বচ্ছ হতে পারে। আসুন একটি গাড়ি এবং ইঞ্জিন নিই। গাড়িটি শুরু করতে (কেবল পাওয়ার আপ করতে, রেডিও শোনার জন্য) আপনি যাচাই করতে চান যে সমস্ত সিস্টেম যেতে প্রস্তুত।

সুতরাং আপনি কোনও ইঞ্জিন, একটি দরজা, একটি চাকা ইত্যাদি নির্মাণ করেন আপনার স্ক্রিন ইঞ্জিন = বন্ধ দেখায়।

ইঞ্জিন ইত্যাদি নিরীক্ষণ শুরু করার দরকার নেই কারণ এগুলি সমস্ত ব্যয়বহুল। তারপরে আপনি যখন জ্বালানোর জন্য কীটি চালু করবেন তখন আপনাকে ইঞ্জিন-> স্টার্ট কল করুন। এটি সমস্ত ব্যয়বহুল প্রক্রিয়া চালানো শুরু করে।

এখন আপনি ইঞ্জিন = চালু দেখতে পাবেন। এবং ইগনিশন প্রক্রিয়া শুরু হয়।

ইঞ্জিন না পাওয়া ছাড়া গাড়ি চালিত হবে না।

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

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