আপনার 'নতুন' কীওয়ার্ডটি কখন ব্যবহার করা উচিত এবং করা উচিত নয়?


15

মিসকো হেভারি দ্বারা প্রদত্ত ইউনিট টেস্টিংয়ে আমি একটি গুগল টেক টক উপস্থাপনা দেখেছি এবং তিনি newব্যবসায়িক লজিক কোডে কীওয়ার্ডটি ব্যবহার এড়াতে বলেছিলেন ।

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

আমি ভাবছি, আমি যখন আমার প্রোগ্রামটির জন্য নতুন কীওয়ার্ডটি ব্যবহার করেছি তখন কি আমি কিছু ভুল করেছি? এবং আমরা এই 'বিধি' কোথায় ভাঙতে পারি?


2
আপনি প্রোগ্রামিং ভাষার সাথে সম্পর্কিত একটি ট্যাগ যুক্ত করতে পারেন? নতুন অনেক ভাষায় বিদ্যমান (সি ++, জাভা, কয়েকটি নাম রুবি) এবং বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে।
সাকিস্ক

উত্তর:


16

এটি কঠোর ও দ্রুত নিয়মের চেয়েও বেশি গাইডেন্স।

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

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

অবশ্যই, আপনি এটি খুব দূরে নিতে পারেন। আপনি যদি নতুন অ্যারেলিস্টটি ফিরিয়ে দিতে চান তবে আপনি সম্ভবত ঠিক আছেন - বিশেষত যদি এটি একটি অপরিবর্তনীয় তালিকা হতে চলেছে।

আপনি যে প্রশ্নটি নিজেকে জিজ্ঞাসা করবেন সেটাই হ'ল "এই ধরণের অবজেক্ট তৈরি করা এই বিট কোডের মূল দায়িত্ব, নাকি এটি কেবল একটি বাস্তবায়ন বিশদ যা আমি যুক্তিসঙ্গতভাবে অন্য কোথাও চলে যেতে পারি?"


1
আচ্ছা আপনি যদি এটি অপরিবর্তনীয় তালিকা হতে চান তবে আপনার Collections.unmodifiableListকিছু বা ব্যবহার করা উচিত । তবে আমি কী বলতে চাই তা আমি জানি:
ম্যাট্রিক্সফ্রোগ

হ্যাঁ, তবে মূল তালিকাটি তৈরি করতে আপনার কোনওরকম দরকার যা আপনি তারপরে পরিবর্তনযোগ্য না হয়ে রূপান্তর করতে পারেন ...
বিল মিশেল

5

এই প্রশ্নের ক্রুশটি শেষ: আমি ভাবছি, আমি যখন আমার প্রোগ্রামটির জন্য নতুন কীওয়ার্ডটি ব্যবহার করেছি তখন কি আমি কিছু ভুল করেছি? এবং আমরা এই 'বিধি' কোথায় ভাঙতে পারি?

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


5

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

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

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

কিছু সাধারণ নির্দেশিকা:

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

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

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


3

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


2

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

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

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

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