ইনজেকশন নির্ভরতা ; বয়লারপ্লেট কোড হ্রাস করার জন্য ভাল অনুশীলন


25

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

তবে আমি বুঝতে পারি যে, আমার প্রকল্পটি বাড়ার সাথে সাথে আমি প্রচুর কোড লিখছি যা আমি বয়লারপ্লেট বিবেচনা করি। সবচেয়ে খারাপ: সত্যিকারের কোডটি কখনও কখনও বোঝা শক্ত করে তুলনায় আরও বেশি বয়লারপ্লেট কোড রয়েছে।

কিছুই ভাল উদাহরণ দেয় না তাই চলুন:

আমার টাইমফ্যাক্টরি নামে একটি ক্লাস রয়েছে যা সময় অবজেক্ট তৈরি করে।

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

আমার অ্যাপ্লিকেশনটিতে, অনেক ক্লাসের সময় অবজেক্ট তৈরি করা দরকার। কখনও কখনও সেই ক্লাসগুলি গভীরভাবে বাসা বেঁধে থাকে।

ধরা যাক, আমার কাছে একটি ক্লাস এ রয়েছে যা ক্লাস বিয়ের উদাহরণ রয়েছে এবং আরও ডি ক্লাস ডি পর্যন্ত টাইম অবজেক্ট তৈরি করা দরকার।

আমার নিষ্পাপ বাস্তবায়নে, আমি টাইমফ্যাক্টরিটি ক্লাস এ এর ​​কনস্ট্রাক্টরের কাছে পাস করি, যা এটি ক্লাস বিয়ের নির্মাতাকে এবং তাই ডি ডি পর্যন্ত অবধি পাস করে

এখন, কল্পনা করুন যে আমার কাছে টাইমফ্যাক্টির মতো কয়েকটি ক্লাস এবং উপরের মতো কয়েকটি শ্রেণি শ্রেণিবিন্যাস রয়েছে: আমি নির্ভরযোগ্যতা ইঞ্জেকশনটি ব্যবহার করার জন্য মনে করি সমস্ত নমনীয়তা এবং পাঠযোগ্যতাটি আমি looseিলা করি।

আমি ভাবতে শুরু করছি যে আমার অ্যাপটিতে কোনও ডিজাইনের কোনও ত্রুটি নেই কিনা ... বা নির্ভরতা ইনজেকশন ব্যবহারের এটি কি প্রয়োজনীয় মন্দ?

আপনি কি মনে করেন ?


5
আমি এই প্রশ্নটি স্ট্যাকওভারফ্লোটির পরিবর্তে প্রোগ্রামারগুলিতে পোস্ট করেছি কারণ, আমি বুঝতে পেরেছি যে, প্রোগ্রামারগুলি সম্পর্কিত সম্পর্কিত কোয়েস্টনগুলির জন্য বেশি এবং স্ট্যাকওভারফ্লো "যখন আপনি নিজের সংকলকের সামনে থাকবেন" -র জন্য রয়েছে। আমি ভুল হলে আগাম দুঃখিত
দিনাইজ

2
দৃষ্টিভঙ্গি ওরিয়েন্টেড প্রোগ্রামিং, এছাড়াও এই কাজের জন্য ভাল হয় - en.wikipedia.org/wiki/Aspect-oriented_programming
এল Yusubov

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

ডি এর সাথে টাইম অবজেক্ট তৈরি করা দরকার, কেবলমাত্র ডি-তে থাকা তথ্য রয়েছে। আপনার বাকী মন্তব্য সম্পর্কে আমাকে ভাবতে হবে। আমার কোডে "কে কে তৈরি করছে" এ সমস্যা হতে পারে
ডাইনাইজ

আইওসি পাত্রে "কে কে তৈরি করছে" সমাধান করা হয়েছে, আমার উত্তরটি বিশদভাবে দেখুন .. "হু হু হু হু হু হু" হ'ল ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করার সময় আপনি সবচেয়ে ভাল প্রশ্ন জিজ্ঞাসা করতে পারেন।
গেম ডেভেলপার

উত্তর:


23

আমার অ্যাপ্লিকেশনটিতে, অনেক ক্লাসের সময় অবজেক্ট তৈরি করা দরকার

দেখে মনে হচ্ছে যে আপনার Timeশ্রেণিটি একটি খুব প্রাথমিক তথ্য প্রকার যা আপনার আবেদনের "সাধারণ অবকাঠামো" এর সাথে সম্পর্কিত should এই জাতীয় ক্লাসের জন্য ডিআই ভাল কাজ করে না। এর অর্থ কী তা নিয়ে ভাবুন যদি কোনও ক্লাসের মতো stringকোডের প্রতিটি অংশে স্ট্রিং ব্যবহার করা হয় এবং আপনাকে stringFactoryনতুন স্ট্রিং তৈরির একমাত্র সম্ভাব্য হিসাবে ব্যবহার করতে হবে - আপনার প্রোগ্রামের পাঠযোগ্যতা একটি আদেশের দ্বারা হ্রাস পাবে মাত্রা।

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


আপনি এটি পুরোপুরি ঠিক আছে। "আপনার প্রোগ্রামের পঠনযোগ্যতা প্রস্থের ক্রম দ্বারা হ্রাস পাবে" " : হ্যাঁ ঠিক এটাই হয়েছিল আমি যদি এখনও একটি কারখানা ব্যবহার করতে চাই তবে এটি একটি সিঙ্গলটন করা কি খারাপ নয়?
ডাইনাইজ

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

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

1
@Dinaiz: সত্যি বলতে, যে নির্ভর করে - রাজ্য ধরনের উপর, ধরনের এবং আপনার প্রোগ্রাম ব্যবহার অংশগুলি সংখ্যার উপর Timeএবং TimeFactory, "বিবর্তনযোগ্যতা" ডিগ্রী আপনি ভবিষ্যতে এর সাথে সম্পর্কিত এক্সটেনশানগুলি প্রয়োজন TimeFactory, ইত্যাদি।
ডক ব্রাউন

ঠিক আছে আমি নির্ভরতা ইনজেকশন রাখার চেষ্টা করব তবে আরও চালাক ডিজাইন রয়েছে যার জন্য এত বেশি বয়লারপ্লেটের প্রয়োজন নেই! অনেক দস্তাবেজকে ধন্যবাদ '
দিনাইজ

4

"আমি নির্ভরযোগ্যতা ইঞ্জেকশনটি ব্যবহার করার জন্য আমার মনে হয় সমস্ত নমনীয়তা এবং পঠনযোগ্যতা আলগা করে" বলতে কী বোঝায় - ডিআই পঠনযোগ্যতা সম্পর্কে নয়। এটি অবজেক্টের মধ্যে নির্ভরতা হ্রাস করা সম্পর্কে।

দেখে মনে হচ্ছে আপনার ক্লাস এ তৈরির ক্লাস বি রয়েছে, ক্লাস বি ক্লাস সি তৈরি করছে এবং ডি সি ক্লাস ডি তৈরি করছে।

ক্লাস বি ক্লাস বিতে ইনজেকশন দেওয়া আপনার ক্লাস বি ক্লাস বিতে ইনজেকশনের সাথে ক্লাস ডি ক্লাস সিতে ইনজেকশন করা উচিত you


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

ডিআই পঠনযোগ্যতা বৃদ্ধি করে কারণ বেশিরভাগ ক্ষেত্রে "নতুন / মুছুন" আপনার কোড থেকে ম্যাজিকালি ছাঁটাই হয়ে যাবে। আপনার যদি গতিশীল বরাদ্দ কোডটি সম্পর্কে যুদ্ধ করতে না হয় তবে পড়া সহজ।
গেম ডেভেলপার

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

3

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

বলা হচ্ছে, একটি পরিবর্তনীয় বস্তু ভাগ করে নেওয়া খুব বিপজ্জনক, যদি এটি সিঙ্ক্রোনাইজ ব্লককে সঠিকভাবে রক্ষা করা হয় তবে সেক্ষেত্রে এটি কোনও সিঙ্গলটন না হওয়ার কোনও কারণ নেই।

যদি আপনি নির্ভরতা ইনজেকশন করতে চান, আপনি বসন্ত বা অন্যান্য নির্ভরতা ইনজেকশন ফ্রেমওয়ার্কগুলি দেখতে চাইতে পারেন, যা আপনাকে কোনও টিকা ব্যবহার করে প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে নির্ধারণ করতে দেয় would


বসন্ত জাভা জন্য এবং আমি সি ++ ব্যবহার করি। তবে কেন 2 জন লোক আপনাকে নীচে নামিয়েছে? আপনার পোস্টে এমন কিছু বিষয় রয়েছে যার সাথে আমি একমত নই তবে এখনও ...
ডাইনাইজ

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

1

এটি ডক ব্রাউন এর পরিপূরক জবাব হতে পারে এবং ডাইনাইজের যে উত্তর এখনও প্রশ্নের সাথে জড়িত তাদের উত্তর না দেওয়া মন্তব্যের জবাব দেওয়া।

আপনার সম্ভবত যা দরকার তা হ'ল ডিআই করার একটি কাঠামো। জটিল শ্রেণিবিন্যাসের অর্থ অগত্যা খারাপ নকশা নয়, তবে আপনাকে যদি সরাসরি ডি তে ইনজেকশন না দিয়ে টাইমফ্যাক্টরি বট আপ-আপ (এ থেকে ডি) ইনজেক্ট করতে হয় তবে আপনি যেভাবে ডিপেন্ডেন্সি ইনজেকশন করছেন তাতে সম্ভবত কিছু ভুল আছে।

একটি সিঙ্গলটন? না ধন্যবাদ. আপনার যদি কেবলমাত্র একটি আইট্যান্স প্রয়োজন হয় তবে তা আপনার অ্যাপ্লিকেশন প্রসঙ্গে জুড়ে দিন (ইনফ্যাক্টের মতো ডিআই এর জন্য আইওসি ধারক ব্যবহারের জন্য ++ টাইমফ্যাক্টিকে একক আইসট্যান্স হিসাবে আবদ্ধ করা প্রয়োজন), উদাহরণটি এখানে (সি ++ 11, তবে সি +++++++++++++] ইতিমধ্যে সি ++ এ? আপনি বিনামূল্যে লিক-ফ্রি অ্যাপ্লিকেশন পান):

Infector::Container ioc; //your app's context

ioc.bindSingleAsNothing<TimeFactory>(); //declare TimeFactory to be shared
ioc.wire<TimeFactory>(); //wire its constructor 

// if you want to be sure TimeFactory is created at startup just request it
// (else it will be created lazily only when needed)
auto myTimeFactory = ioc.buildSingle<TimeFactory>();

এখন আইওসি পাত্রে ভাল কথাটি হ'ল আপনার ডি ডি পর্যন্ত সময় কারখানা পাস করার দরকার নেই যদি আপনার ক্লাস "ডি" এর জন্য সময় কারখানার প্রয়োজন হয়, কেবল ক্লাস ডি এর জন্য কনস্ট্রাক্টর প্যারামিটার হিসাবে টাইম ফ্যাক্টরি রাখুন class

ioc.bindAsNothing<A>(); //declare class A
ioc.bindAsNothing<B>(); //declare class B
ioc.bindAsNothing<D>(); //declare class D

//constructors setup
ioc.wire<D, TimeFactory>(); //time factory injected to class D
ioc.wire<B, D>(); //class D injected to class B
ioc.wire<A, B>(); //class B injected to class A

আপনি একবারে টাইমফ্যাক্টরি ইনজেকশন করতে দেখেন। "এ" কীভাবে ব্যবহার করবেন? খুব সহজ, প্রতিটি শ্রেণি ইনজেকশন দেওয়া হয়, প্রধান নির্মিত হয় বা কারখানার সাথে স্বতন্ত্র হয়।

auto myA1 = ioc.build<A>(); //A is not "single" so many different istances
auto myA2 = ioc.build<A>(); //can live at same time

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

ডি কেবলমাত্র ডি থাকতে পারে এমন তথ্য দিয়ে সময় অবজেক্ট তৈরি করতে পারে

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

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

//factory method
std::unique_ptr<myType> create(params){
    auto istance = ioc->build<myType>(); //this code's agnostic to "myType" hierarchy
    istance->setParams(params); //the customization you needed
    return std::move(istance); 
}

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


বাহ আমি তোমার উত্তর আগে দেখিনি, দুঃখিত! খুব তথ্যবহুল স্যার! আপভোটড
ডাইনাইজ

0

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

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


-1

আমি আরও একটি সি ++ নির্ভরতা ইনজেকশন কাঠামো বাস্তবায়ন করেছি, যা সম্প্রতি উত্থাপনের জন্য প্রস্তাবিত হয়েছিল - https://github.com/krzysztof-jusiak/di - গ্রন্থাগারটি ম্যাক্রো কম (নিখরচায়), কেবলমাত্র শিরোনাম, সি ++ 03 / সি ++ 11 / সি ++ 14 লাইব্রেরি প্রকার নিরাপদ, সংকলন সময়, ম্যাক্রো ফ্রি কনস্ট্রাক্টর নির্ভরতা ইনজেকশন সরবরাহ করে।


3
পি.এসইতে পুরানো প্রশ্নের উত্তর দেওয়া আপনার প্রকল্পের বিজ্ঞাপন দেওয়ার একটি দুর্বল উপায়। বিবেচনা করুন যে সেখানে কয়েক হাজার প্রকল্প রয়েছে যা কিছু প্রশ্নের সাথে কিছুটা প্রাসঙ্গিক হতে পারে। যদি তাদের সমস্ত লেখক এখানে পোস্ট করেন তবে সাইটের উত্তরের গুণটি নিমজ্জিত হবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.