পাইথনে আইওসি / ডিআই কেন সাধারণ নয়?


312

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

পাইথন, স্প্রিংপিথনের জন্য জনপ্রিয় জাভা আইওসি ফ্রেমওয়ার্কগুলির অবশ্যই বেশ কয়েকটি ক্লোন রয়েছে available তবে এগুলির কোনওটিই ব্যবহারিকভাবে ব্যবহার করা হবে বলে মনে হয় না। কমপক্ষে, আমি কখনই জ্যাঙ্গো বা স্ক্ল্যাচমি + <insert your favorite wsgi toolkit here>ভিত্তিক ওয়েব অ্যাপ্লিকেশনটিতে স্টাম্পল করি নি যা এরকম কিছু ব্যবহার করে।

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


2
আমার ধারণা, একই কারণে এটি রুবিতে কম জনপ্রিয়, বিল্ট-ইন মিক্সিন এবং খোলা ক্লাসে
স্যাম সাফ্রন

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

6
ডিআই এর ব্যবহার এবং আইওসি ফ্রেমওয়ার্কের মধ্যে পার্থক্য করার জন্য দয়া করে যত্ন নিন। প্রাক্তনটি একটি নকশার প্যাটার্ন, দ্বিতীয়টি পূর্বের স্বয়ংক্রিয় ব্যবহারে সহায়তা করার জন্য একটি কাঠামো।
ডগ

ডগ, আমি বিশ্বাস করি যে আপনি বলতে চাইছেন ডিআই হ'ল সৃজনশীল বৈশিষ্ট্য যা ডেকোরেটর প্যাটার্নটি ব্যবহার করে প্রাপ্ত।
njappboy

4
আমি এমন একটি উত্তর দেখতে চাই যা ডিআই সমাধান করে এমন বাস্তব বিশ্বের সমস্যার সমাধান করে: লাইফটাইম ম্যানেজমেন্ট, টেস্ট স্টাবিংয়ের স্বাচ্ছন্দ্য ইত্যাদি যদি এগুলি সামাল দেওয়ার আরও বেশি পাইথোনিক উপায় থাকে তবে আমি সব কানেই আছি।
জোশ নো

উত্তর:


197

আমি আসলে মনে করি না যে ডিআই / আইওসি পাইথনের সেই অস্বাভাবিক। যা অস্বাভাবিক তা হ'ল ডিআই / আইওসি ফ্রেমওয়ার্ক / পাত্রে

এটি ভেবে দেখুন: একটি ডিআই কনটেইনার কী করে? এটি আপনাকে অনুমতি দেয়

  1. সম্পূর্ণ অ্যাপ্লিকেশনে একসাথে স্বতন্ত্র উপাদানগুলি তারে ...
  2. ... রানটাইমে

আমাদের "ওয়্যারিং ওয়্যারিং" এবং "রানটাইম এ" এর নাম রয়েছে:

  1. স্ক্রিপ্টিং
  2. প্রগতিশীল

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

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

সুতরাং, পুনরুদ্ধার করার জন্য: ডিআই / আইওসি অনুশীলন ঠিক একই কারণে জাভাতে যেমন পাইথন-তে গুরুত্বপূর্ণ তেমনি গুরুত্বপূর্ণ। বাস্তবায়ন দ্বি / আইওসি'র তবে ভাষা পাতাটা এবং প্রায়ই তাই লাইটওয়েট এটি সম্পূর্ণরূপে অদৃশ্য হয়ে করা হয়।

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

BTW: এটা কি তার যৌক্তিক উপসংহারে দ্বি নিতে দেখে মনে হচ্ছে একটি উদাহরণ জন্য, কটাক্ষপাত করা গিলাদ ব্রাকা এর ভাষা প্রোগ্রামিং Newspeak বিষয় এবং তাঁর লেখা:


58
যদিও আমি একমত। এক্সএমএল মন্তব্যটি ভুল। অনেকগুলি (কমপক্ষে আধুনিক) আইওসি পাত্রে কনফিগারেশন (এক্সএমএল) ওপরে কনভেনশন (কোড) ব্যবহার করে।
ফিঙ্গলাস

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

133
"তবে ডিআই / আইওসি বাস্তবায়ন ভাষায় তৈরি করা হয় এবং প্রায়শই এতটাই হালকা হয় যে এটি সম্পূর্ণরূপে অদৃশ্য হয়ে যায়।" ডাউন ভোট, কারণ এটি স্পষ্টত অসত্য। ডিআই হ'ল এমন একটি প্যাটার্ন যেখানে কোনও ইন্টারফেস কনস্ট্রাক্টরের কাছে পাঠানো হয়। এটি পাইথনে অন্তর্নির্মিত নয়।
ডগ

146
ডাউনভোট, ওয়্যারিংয়ের সাথে স্ক্রিপ্টিংয়ের কোনও সম্পর্ক নেই, ডিআই একটি প্যাটার্ন এবং এটি স্ক্রিপ্টিংয়ের সমতুল্য নয়
লাক্সস্পেস

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

51

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

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


2
এটা বোধগম্য. আমি পাইথনে কোনও প্রয়োগ পরিবর্তন করতে চাইলে আমি একই নামটি ব্যবহার করে কেবল একটি আলাদা অবস্থান থেকে আমদানি করি। তবে এখন আমি ভাবছি যে জাভাতে MyClassInstancesপ্রত্যেকের জন্য একটি শ্রেণি সংজ্ঞায়নের মাধ্যমে এটি অন্যভাবেও সম্ভব MyClass, যেখানে কেবল স্থিতিশীল, সম্পূর্ণ সূচিত উদাহরণ রয়েছে। এটি তারযুক্ত হবে: ডি
tux21b 13

2
এবং অন্য ধারণা: পাইথনে এ জাতীয় আমদানি পরিবর্তনের একটি উপায় সরবরাহ করা সমস্ত অজগর ফাইলগুলিকে স্পর্শ না করে সহজেই বাস্তবায়নগুলি প্রতিস্থাপন করা সম্ভব করে। পরিবর্তে কাঠামোর ভিতরে এটি from framework.auth.user import User লেখার চেয়ে ভাল User = lookup('UserImplentation', 'framework.auth.user.User')(২ য় পরামিতি একটি ডিফল্ট মান হতে পারে)। তারপরে ফ্রেমওয়ার্কের ব্যবহারকারীরা ফ্রেমওয়ার্কটি Userস্পর্শ না করেই বাস্তবায়নটিকে প্রতিস্থাপন / বিশেষায়িত করতে সক্ষম হবেন ।
tux21b

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

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

1
"আপনি কেবলমাত্র একটি মডিউল থেকে এটি আমদানি করে এক ধরণের" সিঙ্গেলটন "পেতে পারেন" এটি
কোনও সোচ্চার

45

আইওসি এবং ডিআই পরিপক্ক পাইথন কোডে অত্যন্ত সাধারণ। হাঁসের টাইপিংয়ের জন্য ডিআই ধন্যবাদ বাস্তবায়নের জন্য আপনার কেবল কাঠামোর দরকার নেই।

সর্বোত্তম উদাহরণটি কীভাবে আপনি ব্যবহার করে একটি জ্যাঙ্গো অ্যাপ্লিকেশন সেট আপ করেন settings.py:

# settings.py
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': REDIS_URL + '/1',
    },
    'local': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'snowflake',
    }
}

জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক ডিআই-কে ব্যাপকভাবে ব্যবহার করে:

class FooView(APIView):
    # The "injected" dependencies:
    permission_classes = (IsAuthenticated, )
    throttle_classes = (ScopedRateThrottle, )
    parser_classes = (parsers.FormParser, parsers.JSONParser, parsers.MultiPartParser)
    renderer_classes = (renderers.JSONRenderer,)

    def get(self, request, *args, **kwargs):
        pass

    def post(self, request, *args, **kwargs):
        pass

আমাকে স্মরণ করিয়ে দিন ( উত্স ):

"নির্ভরতা ইনজেকশন" একটি 5-শতাংশ ধারণার জন্য 25 ডলার শব্দ। [...] নির্ভরতা ইনজেকশন মানে কোনও বস্তুকে তার উদাহরণ ভেরিয়েবল দেওয়া। [...]।


8
+1 টি। ভাল করা. পাইথন প্রোগ্রামার হওয়ায় আমি সি # তে ডিআই ফ্রেমওয়ার্কগুলিতে পুরো সাক্ষাত্কার উপস্থাপনার দ্বারা সম্পূর্ণ বিস্মিত হয়েছিলাম। কিছুক্ষণ চিন্তা করে বুঝতে পেরেছিলাম যে ফ্ল্যাশ অ্যাপ্লিকেশনগুলিতে এটি সম্পর্কে চিন্তা না করেই আমি ইতিমধ্যে এটি সমস্ত সময় করে ফেলেছি কারণ আপনার কোনও কাঠামোর দরকার নেই। সি # / জাভা এর বাইরে কিছু জানে না এমন কারও কাছে প্রশ্নটি বোঝা যায়। টাইপ করা ভাষা প্রোগ্রামারদের কাছে হাঁসের ধরণটি ঠিক স্বাভাবিক এবং আপনি যেমনটি বলেন, "পাঁচ-শতাংশ ধারণার জন্য 25 ডলার শব্দ"।
স্যামুয়েল হারমার

5
ত্রুটি ... এটি নির্ভরতা ইনজেকশন নয় কারণ উদাহরণগুলি ( IsAuthenticated, ScopedRateThrottle) বর্গ দ্বারা ইনস্ট্যান্ট করা হয়। তারা কনস্ট্রাক্টর মধ্যে পাস করা হয় না।
দোপাট্রমান

5
IsAuthenticatedএবং ScopedRateThrottleউদাহরণ নয়, এগুলি ক্লাস classes যখন FooView নির্মিত হয় (প্রকৃতপক্ষে, যখন FooView একটি অনুরোধ প্রক্রিয়াকরণ করে) তখন এগুলি তাত্ক্ষণিক হয়। যাইহোক, এটি কেবল একটি বাস্তবায়ন বিশদ। IsAuthenticatedএবং ScopedRateThrottleনির্ভরতা হয়; তারা ইনজেকশনের হয় FooView। এটা কোন ব্যাপার না যখন বা কিভাবে এই কাজ করা হয়। পাইথন জাভা নয়, তাই এটি প্রয়োগের বিভিন্ন উপায় রয়েছে।
সর্বাধিক মালিশ 7'19

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

3
@ অ্যালেক্স না, অন্য রেন্ডারার ব্যবহার করার জন্য আপনার কোড পরিবর্তন করার দরকার নেই। এমনকি আপনি একযোগে একাধিক রেন্ডারারগুলির ব্যবহার করতে পারেন: renderer_classes = (JSONRenderer, BrowsableAPIRenderer, XMLRenderer)। বিদ্রূপ করা যেমন সহজ @unittest.patch('myapp.views.FooView.permission_classes')। জাভা একটি সংকলিত এবং স্থিতিশীলভাবে টাইপ করা শক্তিশালী রূপক দক্ষতার অভাবের কারণে "কাজ করার উপায়" এর ফলস্বরূপ "কিছু পাস করার" মরিয়া প্রয়োজন।
ম্যাক্স ম্যালিশ

35

জাজানো নিয়ন্ত্রণের বিপরীতমুখীকরণের দুর্দান্ত ব্যবহার করে। উদাহরণস্বরূপ, কনফিগারেশন ফাইল দ্বারা ডাটাবেস সার্ভারটি নির্বাচিত হয়, তারপরে ফ্রেমওয়ার্কটি ডাটাবেস ক্লায়েন্টদের জন্য উপযুক্ত ডাটাবেস র‌্যাপারের উদাহরণ সরবরাহ করে।

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

if config_dbms_name == 'postgresql':
    import psycopg
    self.database_interface = psycopg
elif config_dbms_name == 'mysql':
    ...

পরে কোড লিখে একটি ডাটাবেস ইন্টারফেস তৈরি করতে পারে:

my_db_connection = self.database_interface()
# Do stuff with database.

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


4
আপনি যে কোডটি কল করবেন তা আসলে তারের অংশ। এটি আপনার আইওসি কাঠামোর এক্সএমএল হবে। এটি আসলে হিসাবে সহজভাবে লেখা যেতে পারে import psycopg2 as database_interface। একটি লম্বা লাইনে রাখুন injections.py
spectras

29
ERM। আপনি সেখানে যা করছেন তা হ'ল পাঠ্যপুস্তকটি আবশ্যক ড্যানিয়েল।
শায়েন

এটি অবশ্যই অপরিহার্য কোড, তবে এটি একধরণের কার্যকরী কারণ এটি মান হিসাবে কলযোগ্যকে ব্যবহার করে।
জেরেমি

5
যদিও এটি কেবল প্রথম শ্রেণির ফাংশন নয়? en.wikedia.org/wiki/First-class_function কেবলমাত্র আপনার কাছে রয়েছে এবং সেগুলি ব্যবহার করার কারণে আপনার কোডটি কার্যকর হয় না। এখানে বেশ কয়েকটি পার্শ্ব প্রতিক্রিয়া ঘটছে (যেমন পরিবর্তন করা self.database_interface), যা চিত্কার করে তোলে।
hjc1710

15

এটি পর্যবেক্ষণ করে যে ডিপেন্ডেন্সি ইনজেকশন এবং নিয়ন্ত্রণের বিপরীতে আর কী বোঝায় লোকেরা আসলেই তা পায় না।

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

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

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


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

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

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

12

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


3
এটি কখনই আমাকে বিস্মিত করে না যে কোনও সিস্টেম কীভাবে এটি কাজ করে তা পরীক্ষার জন্য কীভাবে কাজ করে তা পরিবর্তন করতে ইচ্ছুক লোকেরা। এখন আপনাকে পরীক্ষা করতে হবে যে আপনার পরীক্ষাগুলি পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে না।
বেসিক

2
তিনি কেবল পরীক্ষার সুযোগে পুট পদ্ধতি পরিবর্তন করার বিষয়ে কথা বলেন, এটি ইনজেকশনের বস্তুর মক পদ্ধতির মতো।
ডিপিএ

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

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

10

আসলে, এটা বেশ সহজ পর্যাপ্ত পরিষ্কার এবং কম্প্যাক্ট কোড দ্বি সঙ্গে (আমি আশ্চর্য, থাকার এটা হবে / লেখা হয় pythonic তারপর যাহাই হউক না কেন, কিন্তু :)), উদাহরণস্বরূপ আমি আসলে কোডিং এই পদ্ধতি perefer:

def polite(name_str):
    return "dear " + name_str

def rude(name_str):
    return name_str + ", you, moron"

def greet(name_str, call=polite):
    print "Hello, " + call(name_str) + "!"

: _

>>greet("Peter")
Hello, dear Peter!
>>greet("Jack", rude)
Hello, Jack, you, moron!

হ্যাঁ, এটি প্যারামিটারাইজিং ফাংশন / ক্লাসগুলির একটি সাধারণ ফর্ম হিসাবে দেখা যেতে পারে, তবে এটি কাজ করে। সুতরাং, পাইথনের ডিফল্ট-অন্তর্ভুক্ত ব্যাটারি এখানেও যথেষ্ট।

পিএস আমি পাইথনের সাধারণ বুলিয়ান যুক্তির মূল্যায়ন করতে গতিময় এই পদ্ধতির আরও বড় উদাহরণ পোস্ট করেছি ।


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

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

9

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

: পাইথন 3 টীকা দেওয়া, আমি একটি পূর্ণ বৈশিষ্ট্যযুক্ত এ ক্র্যাক, কিন্তু সহজ, নির্ভরতা ইনজেকশন ধারক আছে করার সিদ্ধান্ত নিয়েছে https://github.com/zsims/dic । এটি .NET নির্ভরতা ইনজেকশন ধারক (যে আইএমও আপনি যদি সেই জায়গাতে কখনও খেলেন তবে দুর্দান্ত) এর কিছু ধারণার উপর ভিত্তি করে, তবে পাইথন ধারণাগুলির সাথে পরিবর্তিত।


6

আমি মনে করি পাইথনের গতিশীল প্রকৃতির কারণে লোকেরা প্রায়শই অন্য গতিশীল কাঠামোর প্রয়োজন দেখেন না। যখন কোনও শ্রেণি নতুন-স্টাইলের 'অবজেক্ট' থেকে উত্তরাধিকার সূত্রে আসে আপনি গতিশীলভাবে একটি নতুন পরিবর্তনশীল তৈরি করতে পারেন ( https://wiki.python.org/moin/NewClassVsClassicClass )।

অর্থাত্ সরল অজগরে:

#application.py
class Application(object):
    def __init__(self):
        pass

#main.py
Application.postgres_connection = PostgresConnection()

#other.py
postgres_connection = Application.postgres_connection
db_data = postgres_connection.fetchone()

তবে https://github.com/noodleflake/pyioc এ দেখুন আপনি যা সন্ধান করছেন এটি হতে পারে।

অর্থাত্ পাইক ইন

from libs.service_locator import ServiceLocator

#main.py
ServiceLocator.register(PostgresConnection)

#other.py
postgres_connection = ServiceLocator.resolve(PostgresConnection)
db_data = postgres_connection.fetchone()

2
উভয় সংস্করণ একই পরিমাণের কোড গ্রহণ করে কেন একটি কাঠামো ব্যবহার করা খুব জনপ্রিয় নয় তা বোঝানোর দিকে অনেক বেশি এগিয়ে যায়।
বর্ণা্য

ইন other.pyলাইন 1, সেখানে একটি স্বয়ংক্রিয় অথবা নির্ভরতা মীমাংসা, কিন্তু যে গণনা করবে না নির্ভরশীলতার ইনজেকশন যদিও হিসাবে।
andho

পরিষেবা লোকেটারগুলি সাধারণত একটি এন্টি-প্যাটার্ন হয়, কেবল বলা হয়।
PmanAce

6

আমি "জার্গ ডব্লু মিটাগ" এর জবাব ফিরিয়ে দিয়েছি: "ডিআই / আইওসির পাইথন বাস্তবায়ন এতটাই হালকা যে এটি পুরোপুরি অদৃশ্য হয়ে যায়"।

এই বিবৃতিটি ব্যাক আপ করার জন্য, জাভা থেকে পাইথন পর্যন্ত স্থাপন করা বিখ্যাত মার্টিন ফাউলারের উদাহরণটি দেখুন: পাইথন: ডিজাইন_প্যাটার্নস: বিপরীতমুখী_কন্ট্রোল

উপরের লিঙ্কটি থেকে আপনি দেখতে পাচ্ছেন, পাইথনের একটি "পাত্রে" কোডের 8 টি লাইনে লেখা যেতে পারে:

class Container:
    def __init__(self, system_data):
        for component_name, component_class, component_args in system_data:
            if type(component_class) == types.ClassType:
                args = [self.__dict__[arg] for arg in component_args]
                self.__dict__[component_name] = component_class(*args)
            else:
                self.__dict__[component_name] = component_class

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

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

2

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

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

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

এটি বলেছিল, পাইথনের এমন পরিস্থিতি রয়েছে যেখানে আইওসি পদ্ধতির ব্যবহার আসলে কার্যকর এবং আমি এখানে পড়লাম যে জ্যাঙ্গো এটি ব্যবহার করে।

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


জঙ্গো আইওসি ব্যবহার করে এমন তথ্যের উত্সের জন্য কি কোনও রেফারেন্স URL আছে?
সাজুউক

@ সাজুক, আমি জানতে পেরেছি যে এই প্রশ্নের থ্রেডে জাঙ্গো সম্পর্কে, তাই আমি জানি না, আপনার অন্য উত্তর লেখকদের জিজ্ঞাসা করা উচিত।
zakmck

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

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

The typical Python application is much simpler, just a bunch of scripts, without such a complex architecture.- বেশ ধারনা
হাইয়ানকভ


-1

আমি @ জর্জের সাথে এই বিষয়টিতে একমত যে ডিআই / আইওসি পাইথনে আরও সহজ, সহজ এবং আরও সুন্দর। যা অনুপস্থিত তা হ'ল ফ্রেমওয়ার্কগুলি এটি সমর্থন করে তবে কয়েকটি ব্যতিক্রম রয়েছে। আমার মনে আসা কয়েকটি উদাহরণ তুলে ধরার জন্য:

  • জ্যাঙ্গো মন্তব্য আপনাকে আপনার নিজস্ব কাস্টম যুক্তি এবং ফর্মগুলির সাথে নিজস্ব মন্তব্য শ্রেণিটি তারে দেয়। [অধিক তথ্য]

  • জাজানো আপনার ব্যবহারকারীর মডেলটি সংযুক্ত করতে আপনাকে একটি কাস্টম প্রোফাইল অবজেক্ট ব্যবহার করতে দেয়। এটি সম্পূর্ণ আইওসি নয় তবে এটি একটি ভাল পদ্ধতির। ব্যক্তিগতভাবে আমি মন্তব্যের কাঠামোর মতো গর্ত ব্যবহারকারী মডেলটি প্রতিস্থাপন করতে চাই। [অধিক তথ্য]


-3

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

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

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


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

6
@ এস.লট - জাভাতে অনুরূপ বিধিনিষেধ নিয়ে কাজ করা সত্ত্বেও সি +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + আমি মনে করি এটি একটি সাংস্কৃতিক পার্থক্য বোঝায় যেখানে কিছু করার 2 সম্ভাব্য উপায়গুলির সাথে মোকাবিলা করার পরে, জাভা লোকেরা কৌশল প্যাটার্নটিকে সহজতর করার জন্য অন্য ইন্টারফেস বের করতে পছন্দ করেন যেখানে সি ++ লোকেরা ডানদিকে ডুবে থাকে এবং একটি বুল এবং একটি বিবৃতি যুক্ত করে ...
কাইলোটন

3
@ ফিঙ্গলস তাই যদি আমার সমস্ত ডজন ডজন ক্লাস থাকে EmailSenderএবং এটিকে প্রতিস্থাপনের সিদ্ধান্ত নেয় তবে DesktopNotifierআমাকে 12 ক্লাস হাতে নিয়ে সম্পাদনা করতে হবে। এবং আপনি কি এটি সহজ এবং ক্লিনার মনে করেন যে কেবল একটি INotifierইন্টারফেসে লিখতে এবং ধারকটির বিশদটি কার্যকর করতে দেয়?
বেসিক

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

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

-5

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

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

পাইথন বিকাশকারীরা কাজ শেষ করার দিকে মনোনিবেশ করছেন। তারা যখন প্রয়োজন ক্লাসটি কেবল তারের করে দেয়। এমনকি তাদের ক্লাসের ধরণের বিষয়ে চিন্তা করতে হবে না। যতক্ষণ না তা কোলাহল করতে পারে ততক্ষণ হাঁস! এই প্রকৃতি আইওসির জন্য কোনও জায়গা ছাড়বে না।


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