শ্রেণি নির্মাতার ডেটা (বনাম আচরণ) ইনজেক্ট করার অর্থ কী এবং কেন এটি খারাপ অভ্যাস হিসাবে বিবেচিত হয়?


10

আমি রেমো জানসেনের "শেখার টাইপস্ক্রিপ্ট" বইটি পড়ছি। একটি বিভাগে লেখক বর্ণনা করেছেন যে কীভাবে Modelক্লাসটি তৈরি করা যায় সেগুলি সহ একটি খুব সাধারণ প্রুফ-অফ কনসেপ্ট এমভিসি কাঠামো তৈরি করা যায় এবং নিম্নলিখিতটি বলেছেন:

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

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

class Person {
  constructor(name) {
    this.name = name;
  }
}

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

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


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

@ModelSettings("./data/nasdaq.json")
class NasdaqModel extends Model implements IModel {
  constructor(metiator : IMediator) {
    super(metiator);
  }
...
}

আমি ঠিক বুঝতে পারছি না যে কেন আমি ডিজিটরের মাধ্যমে পরিষেবা ইউআরএল যুক্ত করা উচিত কেবল কনস্ট্রাক্টরের প্যারামিটার হিসাবে না eg

constructor(metiator : IMediator, serviceUrl : string) {...

আমি আপনাকে নির্ভরতা ইনজেকশন সম্পর্কে গুগলে একটি দ্রুত অনুসন্ধান করার পরামর্শ দিচ্ছি । এই প্রশ্নটি জিজ্ঞাসা করার জন্য এটি সঠিক ফোরাম নয়। :)
টস্কভ

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

নির্ভরতা ইনজেকশন এবং ডেটা ইনজেকশন 2 ভিন্ন জিনিস। 1 ম হ'ল একটি নকশার নীতি, যখন ২ য় ধরণের আক্রমণ। আপনি যদি একটি পরিষ্কার অনুসন্ধান শব্দ চান তবে "নিয়ন্ত্রণের বিপরীতমুখীকরণ" চেষ্টা করুন। এটি কিছুটা বিস্তৃত তবে একটি পরিষ্কার ছবি আঁকার ক্ষেত্রেও সহায়তা করে।
টস্কভ

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

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

উত্তর:


5

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

আমার মাথার শীর্ষে, আমি বিভিন্ন পরিস্থিতি সম্পর্কে ভাবতে পারি যেখানে কনস্ট্রাক্টরের মাধ্যমে ডেটা পাস করা ভাল, কিছু নিরপেক্ষ, তবে যেখানে এটি খারাপ তা নয় none

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

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

পরিবর্তনীয় বস্তুগুলি আপনি যা চান তা সত্ত্বেও, এই খারাপ অভ্যাসটি কীভাবে:

var blah = new Rectangle(x,y,width,height);

পক্ষে:

var blah = new Rectangle();
blah.X = x;
blah.Y = y;
blah.Width = width;
blah.Height = height;

লেখক কি সত্যিই প্রথম খারাপ অনুশীলন বলে মনে করেন এবং আমার সর্বদা বিকল্প 2 দিয়ে যাওয়া উচিত? আমি মনে করি এটি পাগল কথা।

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


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

0

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

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


হ্যাঁ, মডেলটির ডেটা পুনরুদ্ধার করা প্রয়োজন (অবশেষে আপনার পরামর্শ অনুসারে একটি দূরবর্তী ওয়েব পরিষেবা থেকে, তবে বইটিতে এটি কেবল একটি ডেমো, সুতরাং এটি প্রাথমিকভাবে কেবল উপস্থাপিত ডেটা সরাসরি ইনলাইন কোড করে)। "ওয়েব পরিষেবার পদ্ধতিতে" আর্গুমেন্ট হিসাবে ডেটা পাস করার বিষয়ে আপনার পরামর্শটি আমি বুঝতে পারছি না। আমি একটি সজ্জাকারীর জন্য কনস্ট্রাক্টরের বনাম (2) প্যারামিটার (1) হিসাবে ডেটা পাস করার মধ্যে পার্থক্য সম্পর্কে জিজ্ঞাসা করছিলাম। আপনি একটি তৃতীয় বিকল্পের পরামর্শ দিচ্ছেন বলে মনে হচ্ছে, যেমন ওয়েব পরিষেবাদির কোনও পদ্ধতির জন্য প্যারামিটার / আর্গুমেন্ট হিসাবে ডেটা পাস করা। আমি কি তোমার কথা মিস করছি?
অ্যান্ড্রু উইলেস

0

শুধু মনন.

যদি আমি 'ডেটা নয়, ইনজেকশন আচরণ করি', তবে আমি এটি না করেই চিন্তা করব:

(সিউডোকোডের উদাহরণের জন্য দুঃখিত):

class NoiseMaker{
  String noise;
  NoiseMaker(String noise){
     this.noise = noise;
  }
  void soNoise(){
    writeToOutput(noise)
  }
}

এটা করতে:

interface Noise{
  String getAudibleNoise();
}

class PanicYell implements Noise{
   String getAudibleNoise(){
       return generateRandomYell();
   }
   .....
}



class WhiteNoise implements Noise{
   String getAudibleNoise(){
       return generateNoiseAtAllFrequences();
   }
   .....
}

class NoiseMaker{
  Noise noise;
  NoiseMaker(Noise noise){
     this.noise = noise;
  }
  void soNoise(){
    writeToOutput(noise.getAudibleNoise())
  }
}

আপনি এই শব্দটির আচরণটি সর্বদা পরিবর্তন করতে পারবেন, এলোমেলো করে তুলুন, একটি অভ্যন্তর পরিবর্তকের উপর নির্ভরশীল ...

আমি মনে করি যে এটি 'উত্তরাধিকারের পক্ষে অনুকূল সম্মিলিত' বিধি সম্পর্কে সমস্ত কিছু। যা একটি দুর্দান্ত নিয়ম, আমি অবশ্যই বলতে হবে।

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

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