AngularJS: ডিজাইনের ধরণ বোঝা


147

আইগর মিনার এই পোস্টের প্রসঙ্গে , অ্যাঙ্গুলারজেএস এর নেতৃত্ব:

এমভিসি বনাম এমভিভিএম বনাম এমভিপি । কী বিতর্কিত বিষয় যা অনেক বিকাশকারী বিতর্ক এবং বিতর্ক করতে ঘন্টা এবং ঘন্টা ব্যয় করতে পারে।

বেশ কয়েক বছর AngularJS জন্য MVC (বরং বা তার ক্লায়েন্ট-সাইড এক রূপ) কাছাকাছি, কিন্তু সময় এবং অনেক refactorings এবং API উন্নতি ধন্যবাদ ছিল, এটি এখন কাছাকাছি এর MVVM - $ সুযোগ বস্তুর বিবেচনা করা যেতে পারে ViewModel যে হচ্ছে এমন একটি ফাংশন দ্বারা সজ্জিত যা আমরা একটি কন্ট্রোলার বলি ।

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

বলার পরে, আমি এমভি * ননসেন্স সম্পর্কে বিতর্ক করতে সময় নষ্ট করার চেয়ে, বিকাশকারীদের দেখতে পাচ্ছি যে কিক-অ্যাস অ্যাপ্লিকেশনগুলি ভালভাবে ডিজাইন করা হয়েছে এবং উদ্বেগের বিচ্ছেদকে অনুসরণ করবে। আর এই কারণে, আমি ঘোষনা করছি ঘোষণা AngularJS হতে MVW ফ্রেমওয়ার্ক - মডেল দেখুন-যাই হোক না কেন । যেখানে যাই হোক না কেন " যা আপনার পক্ষে কাজ করে " এর জন্য দাঁড়িয়েছে ।

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

ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনগুলিতে অ্যাঙ্গুলারজেএস এমভিডাব্লু (মডেল-ভিউ-যাই হোক না কেন) ডিজাইন প্যাটার্ন বাস্তবায়নের জন্য কি কোনও প্রস্তাবনা বা নির্দেশিকা রয়েছে?


এমভি * আজেবাজে সম্পর্কে তর্ক করতে সময় নষ্ট করার চেয়ে তাদের জন্য উন্নত ...
শিরগিল ফারহান

1
শব্দের শ্রেণি নকশার ধরণটি অনুসরণ করতে আপনার কৌনিক প্রয়োজন নেই।
দরকারীবেলা

উত্তর:


223

অ্যাংুলারজেএস অ্যাপ্লিকেশনগুলিতে উপাদানগুলি প্রয়োগ করার জন্য প্রচুর মূল্যবান উত্সের জন্য আমি কিছু সাধারণ সুপারিশ পেয়েছি:


নিয়ামক

  • নিয়ামকটি মডেল এবং দর্শনের মধ্যে কেবল একটি ইন্টারলেয়ার হওয়া উচিত । এটি যতটা সম্ভব পাতলা করার চেষ্টা করুন ।

  • নিয়ামকটিতে ব্যবসায়িক যুক্তি এড়াতে এটির উচ্চ প্রস্তাব দেওয়া হয় । এটি মডেল স্থানান্তরিত করা উচিত।

  • নিয়ন্ত্রক পদ্ধতি আবাহন (সম্ভাব্য যখন শিশু পিতা বা মাতা সঙ্গে যোগাযোগ করতে চায়) অথবা ব্যবহার করে অন্যান্য কন্ট্রোলার সঙ্গে যোগাযোগ করতে পারে $ নির্গত , $ সম্প্রচারের এবং $ উপর পদ্ধতি। নিঃসৃত এবং সম্প্রচারিত বার্তাগুলি সর্বনিম্ন রাখা উচিত।

  • নিয়ন্ত্রকের উপস্থাপনা বা ডিওএম ম্যানিপুলেশন সম্পর্কে যত্ন নেওয়া উচিত নয়

  • নেস্টেড কন্ট্রোলারগুলি এড়ানোর চেষ্টা করুন । এক্ষেত্রে প্যারেন্ট কন্ট্রোলারকে মডেল হিসাবে ব্যাখ্যা করা হয়। পরিবর্তে ভাগ করা পরিষেবা হিসাবে মডেলগুলি ইনজেক্ট করুন।

  • উপস্থাপনা মডেল ডিজাইনের ধরণ হিসাবে ভিউ মডেলকে ভিউ এবং এনক্যাপসুলেটিং সহ মডেলকে বাঁধাই করার জন্য কন্ট্রোলার স্কোপ ব্যবহার করা উচিত ।


ব্যাপ্তি

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

দ্বি নির্দেশমূলক বাঁধাইয়ের সময় (এনজি-মডেল) নিশ্চিত হয়ে নিন যে আপনি সরাসরি স্কোপ বৈশিষ্ট্যের সাথে আবদ্ধ না হন।


মডেল

অ্যাঙ্গুলারজেএস-এ মডেল হ'ল পরিষেবা দ্বারা সংজ্ঞায়িত একক সিঙ্গলটন ।

মডেল পৃথক করে ডেটা এবং প্রদর্শনের একটি দুর্দান্ত উপায় সরবরাহ করে।

মডেলগুলি ইউনিট পরীক্ষার প্রধান প্রার্থী, কারণ তাদের সাধারণত একমাত্র নির্ভরতা থাকে (ইভেন্ট ইমিটারের কিছু রূপ, সাধারণ ক্ষেত্রে the রুটস্কোপ ) এবং এতে অত্যন্ত পরীক্ষামূলক ডোমেইন যুক্তি থাকে

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

  • মডেলটিকে আপনার অ্যাপ্লিকেশনটির ডেটা সজ্জিত করা উচিত এবং সেই ডেটা অ্যাক্সেস এবং ম্যানিপুলেট করার জন্য একটি এপিআই সরবরাহ করতে হবে।

  • মডেলটি পোর্টেবল হওয়া উচিত যাতে এটি সহজেই অনুরূপ অ্যাপ্লিকেশনে স্থানান্তর করা যায়।

  • আপনার মডেলটিতে ইউনিট যুক্তিকে আলাদা করে আপনি সনাক্ত করা, আপডেট করা এবং রক্ষণাবেক্ষণ করা সহজ করে দিয়েছেন made

  • মডেল আরও সাধারণ গ্লোবাল মডেলগুলির পদ্ধতি ব্যবহার করতে পারে যা পুরো প্রয়োগের জন্য সাধারণ।

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

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

মডেল বাস্তবায়ন

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

AngularJS অ্যাপ্লিকেশনে এটি করার উপায় হ'ল এটি কারখানার পরিষেবা ধরণের ব্যবহার করে সংজ্ঞা দেওয়া ine এটি আমাদের ব্যক্তিগত সম্পত্তি এবং পদ্ধতিগুলি খুব সহজেই সংজ্ঞায়িত করতে এবং একক জায়গায় প্রকাশ্যে অ্যাক্সেসযোগ্য একটিকে ফিরিয়ে আনতে সহায়তা করবে যা এটি বিকাশকারীদের জন্য সত্যই পাঠযোগ্য করে তুলবে।

একটি উদাহরণ :

angular.module('search')
.factory( 'searchModel', ['searchResource', function (searchResource) {

  var itemsPerPage = 10,
  currentPage = 1,
  totalPages = 0,
  allLoaded = false,
  searchQuery;

  function init(params) {
    itemsPerPage = params.itemsPerPage || itemsPerPage;
    searchQuery = params.substring || searchQuery;
  }

  function findItems(page, queryParams) {
    searchQuery = queryParams.substring || searchQuery;

    return searchResource.fetch(searchQuery, page, itemsPerPage).then( function (results) {
      totalPages = results.totalPages;
      currentPage = results.currentPage;
      allLoaded = totalPages <= currentPage;

      return results.list
    });
  }

  function findNext() {
    return findItems(currentPage + 1);
  }

  function isAllLoaded() {
    return allLoaded;
  }

  // return public model API  
  return {
    /**
     * @param {Object} params
     */
    init: init,

    /**
     * @param {Number} page
     * @param {Object} queryParams
     * @return {Object} promise
     */
    find: findItems,

    /**
     * @return {Boolean}
     */
    allLoaded: isAllLoaded,

    /**
     * @return {Object} promise
     */
    findNext: findNext
  };
});

নতুন দৃষ্টান্ত তৈরি করা হচ্ছে

এমন কারখানাটি এড়ানোর চেষ্টা করুন যা নির্ভরযোগ্যতা ইনজেকশনটি ভেঙে ফেলা শুরু করে এবং লাইব্রেরিটি বিশ্রীভাবে আচরণ করবে, বিশেষত তৃতীয় পক্ষের জন্য new

একই জিনিসটি সম্পাদন করার একটি আরও ভাল উপায় হ'ল ফ্যাক্টরিটি তাদের সাথে সংযুক্ত গিটার এবং সেটার পদ্ধতিগুলির সাথে অবজেক্টগুলির সংগ্রহ ফিরিয়ে আনার জন্য একটি API হিসাবে ব্যবহার করা।

angular.module('car')
 .factory( 'carModel', ['carResource', function (carResource) {

  function Car(data) {
    angular.extend(this, data);
  }

  Car.prototype = {
    save: function () {
      // TODO: strip irrelevant fields
      var carData = //...
      return carResource.save(carData);
    }
  };

  function getCarById ( id ) {
    return carResource.getById(id).then(function (data) {
      return new Car(data);
    });
  }

  // the public API
  return {
    // ...
    findById: getCarById
    // ...
  };
});

গ্লোবাল মডেল

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

বিশেষ ক্ষেত্রে কিছু পদ্ধতির প্রয়োগের মধ্যে বিশ্বব্যাপী অ্যাক্সেসযোগ্যতার প্রয়োজন। এটি সম্ভব করার জন্য আপনি অ্যাপ্লিকেশন বুটস্ট্র্যাপের সময় ' সাধারণ ' বৈশিষ্ট্যটি $ রুটস্কোপে সংজ্ঞায়িত করতে পারেন এবং এটিকে কমনমোডেলে আবদ্ধ করতে পারেন :

angular.module('app', ['app.common'])
.config(...)
.run(['$rootScope', 'commonModel', function ($rootScope, commonModel) {
  $rootScope.common = 'commonModel';
}]);

আপনার সমস্ত বৈশ্বিক পদ্ধতিগুলি ' সাধারণ ' সম্পত্তির মধ্যে থাকবে। এটি একরকম নেমস্পেস

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


সংস্থান

রিসোর্স আপনাকে বিভিন্ন ডেটা উত্সের সাথে ইন্টারঅ্যাক্ট করতে দেয় ।

একক দায়িত্ব-নীতি ব্যবহার করে প্রয়োগ করা উচিত ।

বিশেষ ক্ষেত্রে এটি HTTP / JSON শেষের পয়েন্টগুলির জন্য পুনরায় ব্যবহারযোগ্য প্রক্সি।

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

রিসোর্স বাস্তবায়ন

এমন একটি কারখানা যা একটি রিসোর্স অবজেক্ট তৈরি করে যা আপনাকে RESTful সার্ভার-সাইড ডেটা উত্সগুলির সাথে ইন্টারঅ্যাক্ট করতে দেয়।

প্রত্যাশিত রিসোর্স অবজেক্টে অ্যাকশন পদ্ধতি রয়েছে যা নিম্ন স্তরের $ http পরিষেবাটির সাথে ইন্টারেক্ট করার প্রয়োজন ছাড়াই উচ্চ-স্তরের আচরণ সরবরাহ করে।


সেবা

মডেল এবং সংস্থান উভয়ই পরিষেবা

সার্ভিস unassociated হয় ঢিলেঢালাভাবে মিলিত কার্যকারিতা ইউনিট স্বয়ংসম্পূর্ণ হয়।

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

কৌণিক অ্যাপ্লিকেশনগুলিতে পরিষেবাগুলি হ'ল বিকল্প পদার্থ যা নির্ভরতা ইনজেকশন ব্যবহার করে একসাথে তারযুক্ত হয়।

কৌণিক বিভিন্ন ধরণের পরিষেবা নিয়ে আসে। প্রতিটি নিজস্ব ব্যবহারের ক্ষেত্রে। অনুগ্রহ করে পড়ুন বোঝাপড়া পরিষেবা প্রকারভেদ বিস্তারিত জানার জন্য।

আপনার আবেদনে পরিষেবা আর্কিটেকচারের মূল নীতিগুলি বিবেচনা করার চেষ্টা করুন ।

ওয়েব সার্ভিসেস গ্লোসারি অনুসারে সাধারণভাবে :

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


ক্লায়েন্ট-পাশের কাঠামো

সাধারণ ক্লায়েন্টের ক্ষেত্রে অ্যাপ্লিকেশনটির মডিউলগুলিতে বিভক্ত হয় । প্রতিটি মডিউল ইউনিট হিসাবে টেস্টযোগ্য হওয়া উচিত ।

বৈশিষ্ট্য / কার্যকারিতা বা দেখার উপর নির্ভর করে মডিউলগুলি সংজ্ঞায়িত করার চেষ্টা করুন , টাইপ অনুসারে নয়। বিশদ জন্য মিসকো উপস্থাপনা দেখুন ।

মডিউল উপাদানগুলি নিয়ন্ত্রক, মডেল, ভিউ, ফিল্টার, নির্দেশিকা ইত্যাদির মতো প্রচলিতভাবে গোষ্ঠীভুক্ত হতে পারে

কিন্তু মডিউল নিজেই রয়ে পুনর্ব্যবহারযোগ্য , হস্তান্তরযোগ্য এবং testable

বিকাশকারীদের কোডের কিছু অংশ এবং এর সমস্ত নির্ভরতা খুঁজে পাওয়াও অনেক সহজ।

বিশদের জন্য বৃহত্তর AngularJS এবং জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলিতে কোড সংস্থার উল্লেখ করুন।

ফোল্ডার কাঠামোগত একটি উদাহরণ :

|-- src/
|   |-- app/
|   |   |-- app.js
|   |   |-- home/
|   |   |   |-- home.js
|   |   |   |-- homeCtrl.js
|   |   |   |-- home.spec.js
|   |   |   |-- home.tpl.html
|   |   |   |-- home.less
|   |   |-- user/
|   |   |   |-- user.js
|   |   |   |-- userCtrl.js
|   |   |   |-- userModel.js
|   |   |   |-- userResource.js
|   |   |   |-- user.spec.js
|   |   |   |-- user.tpl.html
|   |   |   |-- user.less
|   |   |   |-- create/
|   |   |   |   |-- create.js
|   |   |   |   |-- createCtrl.js
|   |   |   |   |-- create.tpl.html
|   |-- common/
|   |   |-- authentication/
|   |   |   |-- authentication.js
|   |   |   |-- authenticationModel.js
|   |   |   |-- authenticationService.js
|   |-- assets/
|   |   |-- images/
|   |   |   |-- logo.png
|   |   |   |-- user/
|   |   |   |   |-- user-icon.png
|   |   |   |   |-- user-default-avatar.png
|   |-- index.html

কৌণিক অ্যাপ্লিকেশন কাঠামোর ভাল উদাহরণ কৌণিক-অ্যাপ্লিকেশন দ্বারা প্রয়োগ করা হয় - https://github.com/angular-app/angular-app/tree/master/client/src

এটি আধুনিক অ্যাপ্লিকেশন জেনারেটর দ্বারা বিবেচিত - https://github.com/yeoman/generator-angular/issues/109


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

3
আমি বলব - কন্ট্রোলারকে ভিউ মডেল হিসাবে বিবেচনা করুন।
আর্টেম প্লাটোনভ

1
+1 টি। এখানে কিছু দুর্দান্ত পরামর্শ! ২. দুর্ভাগ্যক্রমে উদাহরণ searchModelপুনরায় ব্যবহারের পরামর্শ অনুসরণ করে না। constantপরিষেবার মাধ্যমে স্থিরকগুলি আমদানি করা আরও ভাল । ৩. এখানে কোন অর্থ বোঝানো হয়েছে তার কোন ব্যাখ্যা?:Try to avoid having a factory that returns a new able function
দিমিত্রি জইতসেভ

1
এছাড়াও ওভাররাইটিং অবজেক্টের prototypeসম্পত্তি উত্তরাধিকার ভেঙে দেয়, পরিবর্তে যে কোনও এটি ব্যবহার করতে পারেCar.prototype.save = ...
দিমিত্রি জায়ে

2
@ ক্রিশ্চিয়ানো আচেঙ্গার, এটি জাভাস্ক্রিপ্ট প্রোটোটাইপ চেইনের প্রকৃতি সম্পর্কে যা objectআপনাকে সঠিক সম্পত্তি বা setterফাংশনে লিখতে হবে তা নিশ্চিত করার জন্য আপনার দ্বি-দ্বি বাইন্ডিং এক্সপ্রেশনটিতে একটি ব্যবহার করতে বাধ্য করে। আপনার সুযোগের সরাসরি সম্পত্তি ব্যবহার করার ক্ষেত্রে ( বিন্দুবিহীন ) প্রোটোটাইপ শৃঙ্খলে নিকটস্থ উচ্চতর স্কোপটিতে নতুনভাবে তৈরির সাথে কাঙ্ক্ষিত টার্গেট সম্পত্তিটি লিখতে গিয়ে আপনার ঝুঁকি রয়েছে। মিসকোর উপস্থাপনায়
আর্টেম প্লাটোভেনভ

46

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

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

এই বিট বিট করা যাক।

নির্দেশিকা

দেখেছে

কৌণিক প্রসঙ্গে, ভিউটি ডিওএম। গাইডলাইনগুলি হ'ল:

না:

  • বর্তমান স্কোপ ভেরিয়েবল (কেবল পঠনযোগ্য)।
  • কর্মের জন্য নিয়ামককে কল করুন।

না:

  • কোন যুক্তি রাখুন।

লোভনীয়, সংক্ষিপ্ত এবং নির্দোষ এই চেহারা হিসাবে:

ng-click="collapsed = !collapsed"

এটি কোনও বিকাশকারীকে বোঝায় যে এখন জাভাস্ক্রিপ্ট ফাইল এবং এইচটিএমএল উভয়কেই পরিদর্শন করার জন্য সিস্টেমটি কীভাবে কাজ করে তা বুঝতে।

কন্ট্রোলার

না:

  • স্কোপে ডেটা রেখে 'মডেল'-এ ভিউ বাঁধুন।
  • ব্যবহারকারীর ক্রিয়াতে সাড়া দিন।
  • উপস্থাপনার যুক্তি দিয়ে কাজ করুন।

না:

  • যে কোনও ব্যবসায়ের যুক্তি দিয়ে কাজ করুন।

শেষ নির্দেশিকাটির কারণ হ'ল নিয়ন্ত্রকরা সত্ত্বা নয়, দেখার জন্য বোন; না তারা পুনরায় ব্যবহারযোগ্য।

আপনি তর্ক করতে পারেন যে নির্দেশাবলী পুনরায় ব্যবহারযোগ্য, তবে নির্দেশিকাও খুব দেখার জন্য বোন (ডিওএম) - এগুলি কখনই সত্তার সাথে সামঞ্জস্য করার উদ্দেশ্যে করা হয়নি।

অবশ্যই, কখনও কখনও দেখা সত্ত্বাকে প্রতিনিধিত্ব করে তবে এটি একটি নির্দিষ্ট ক্ষেত্রে rather

অন্য কথায় কন্ট্রোলাররা উপস্থাপনাটির দিকে মনোনিবেশ করবে - আপনি যদি ব্যবসায় যুক্তি যুক্ত করেন তবে কেবল আপনিই স্ফীত, স্বল্প-পরিচালনাযোগ্য নিয়ামককেই শেষ করতে পারবেন না, তবে উদ্বেগের নীতির বিচ্ছেদ লঙ্ঘনও করবেন।

এমনিতেই , কৌণিক নিয়ন্ত্রণকারীরা উপস্থাপনা মডেল বা এমভিভিএমের প্রকৃতপক্ষে বেশি ।

এবং তাই, যদি কন্ট্রোলাররা ব্যবসায়ের যুক্তি নিয়ে কাজ না করে তবে কার উচিত?

একটি মডেল কি?

আপনার ক্লায়েন্ট মডেল প্রায়শই আংশিক এবং বাসি হয়

আপনি অফলাইন ওয়েব অ্যাপ্লিকেশন, বা মারাত্মক সরল (কিছু সত্তা) এমন কোনও অ্যাপ্লিকেশন না লিখলে আপনার ক্লায়েন্টের মডেলটি খুব সম্ভবত:

  • আংশিক
    • হয় এটির সমস্ত সত্ত্বা নেই (যেমন পৃষ্ঠাগুলির ক্ষেত্রে)
    • বা এটিতে সমস্ত ডেটা নেই (যেমন পৃষ্ঠাগুলির ক্ষেত্রে)
  • বাসি - যদি সিস্টেমটির একাধিক ব্যবহারকারী থাকে তবে যে কোনও মুহুর্তে আপনি নিশ্চিত হতে পারবেন না যে ক্লায়েন্টটি যে মডেলটি ধরেছে সেটি সার্ভারের হোল্ডের মতোই is

আসল মডেল অবিরত থাকতে হবে

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

ফল

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

এর মতো, ক্লায়েন্ট প্রসঙ্গে, ছোট হাতের অক্ষর ব্যবহার করা সম্ভবত বুদ্ধিমানের কাজ M- সুতরাং এটি সত্যই এমভিসি , এমভিপি এবং এমভিভিএম । বড় Mসার্ভারের জন্য নয়।

ব্যবসায়িক যুক্তি

ব্যবসায়ের মডেল সম্পর্কে খুব গুরুত্বপূর্ণ ধারণাগুলির মধ্যে একটি হ'ল আপনি এগুলিকে ২ টি ধরণের বিভক্ত করতে পারেন (আমি তৃতীয় দর্শন-ব্যবসায়কে বাদ দিয়েছি যা অন্য দিনের গল্প হিসাবে রয়েছে):

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

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

এখনও প্রশ্নটি রয়ে গেছে - আপনি কৌনিক প্রয়োগের মধ্যে এগুলি কোথায় ফেলেছেন?

3 বনাম 4 স্তর স্থাপত্য

এই সমস্ত এমভিডাব্লু ফ্রেমওয়ার্ক 3 টি স্তর ব্যবহার করে:

তিনটি চেনাশোনা।  অভ্যন্তরীণ - মডেল, মাঝারি - নিয়ামক, বাহ্যিক - দেখুন

এটি যখন ক্লায়েন্টদের কাছে আসে তখন এটির সাথে দুটি মৌলিক সমস্যা রয়েছে:

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

এই কৌশলটির বিকল্প হ'ল 4 স্তর কৌশল :

অভ্যন্তরীণ থেকে বহির্মুখী 4 টি চেনাশোনা - এন্টারপ্রাইজ ব্যবসায়ের বিধি, প্রয়োগ ব্যবসায়ের বিধি, ইন্টারফেস অ্যাডাপ্টার, ফ্রেমওয়ার্ক এবং ড্রাইভার

এখানে আসল চুক্তি হ'ল অ্যাপ্লিকেশন ব্যবসায়ের নিয়ম স্তর (ব্যবহারের কেস), যা প্রায়শই ক্লায়েন্টদের কাছে ভুল am

এই স্তরে interactors (আঙ্কেল বব), যা প্রায় কাছাকাছি কি মার্টিন জালিয়া একটি কল দ্বারা বিষয়টি উপলব্ধি অপারেশন স্ক্রিপ্ট পরিষেবা স্তর

কংক্রিট উদাহরণ

নিম্নলিখিত ওয়েব অ্যাপ্লিকেশন বিবেচনা করুন:

  • অ্যাপ্লিকেশনটিতে ব্যবহারকারীদের একটি পৃষ্ঠাযুক্ত তালিকা দেখানো হয়েছে।
  • ব্যবহারকারী 'ব্যবহারকারী যুক্ত করুন' ক্লিক করে।
  • একটি মডেল ব্যবহারকারীর বিশদ পূরণ করার জন্য একটি ফর্ম সহ খোলে।
  • ব্যবহারকারীর ফর্মটি পূরণ করে জমা দিন।

কয়েকটি জিনিস এখন ঘটতে হবে:

  • ফর্মটি ক্লায়েন্ট-বৈধ হওয়া উচিত।
  • একটি অনুরোধ সার্ভারে প্রেরণ করা হবে।
  • একটি ত্রুটি থাকলে তা পরিচালনা করা হবে।
  • ব্যবহারকারীর তালিকার প্রয়োজন বা না (প্যাজিনেশনের কারণে) আপডেট করার প্রয়োজন।

আমরা এই সব কোথায় ফেলে দিই?

যদি আপনার আর্কিটেকচারটিতে কল করা কোনও নিয়ামক জড়িত থাকে $resource, তবে কন্ট্রোলারের মধ্যে এই সমস্ত ঘটবে। তবে আরও ভাল কৌশল আছে।

একটি প্রস্তাবিত সমাধান

নিম্নলিখিত চিত্রটি অ্যাংুলার ক্লায়েন্টগুলিতে অন্য অ্যাপ্লিকেশন লজিক স্তর যুক্ত করে উপরের সমস্যাটি কীভাবে সমাধান করা যেতে পারে তা দেখায়:

4 বাক্স - ডিওএম কন্ট্রোলারের দিকে নির্দেশ করে, যা অ্যাপ্লিকেশন যুক্তির দিকে নির্দেশ করে, যা $ সংস্থানকে নির্দেশ করে

সুতরাং আমরা নিয়ামকের মধ্যে $ সংস্থানগুলির মধ্যে একটি স্তর যুক্ত করি, এই স্তরটিকে (এটি ইন্টারঅ্যাক্টর বলতে পারি ):

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

এবং তাই উপরের কংক্রিটের উদাহরণের প্রয়োজনীয়তা সহ:

  • ব্যবহারকারী 'ব্যবহারকারী যুক্ত করুন' ক্লিক করে।
  • কন্ট্রোলার একটি ফাঁকা ব্যবহারকারীর মডেলটির জন্য ইন্টারঅ্যাক্টরকে জিজ্ঞাসা করে, এটি ব্যবসার যুক্তি পদ্ধতিতে যেমন সজ্জিত validate()
  • জমা দেওয়ার পরে, নিয়ামক মডেল validate()পদ্ধতিটি কল করে ।
  • ব্যর্থ হলে, নিয়ামক ত্রুটিটি পরিচালনা করে।
  • যদি সফল হয় তবে কন্ট্রোলার ইন্টারঅ্যাক্টরকে কল করে createUser()
  • ইন্টারেক্টর কল $ সংস্থান
  • প্রতিক্রিয়া হিসাবে, ইন্টারেক্টর নিয়ামককে কোনও ত্রুটি পেশ করে, যা সেগুলি পরিচালনা করে।
  • সফল প্রতিক্রিয়ার পরে, ইন্টারেক্টর নিশ্চিত করে যে প্রয়োজন হলে ব্যবহারকারীর তালিকা আপডেট করে।

সুতরাং অ্যাংুলারজেএসকে এমভিডাব্লু সংজ্ঞায়িত করা হয়েছে (যেখানে ডব্লু যা কিছু হোক না কেন) যেহেতু আমি বিএল এর সাথে একটি কন্ট্রোলার (এতে সমস্ত ব্যবসায়িক যুক্তি সহ) বা একটি ভিউ মডেল / উপস্থাপক (ব্যবসার যুক্তি ছাড়াই তবে কেবল ভিউ পূরণ করার জন্য কিছু কোড) বেছে নিতে পারি একটি পৃথক পরিষেবা? আমি কি সঠিক?
BAD_SEED

সর্বোত্তম উত্তর. আপনার কি 4-স্তরযুক্ত কৌণিক অ্যাপ্লিকেশনটির গিটহাবের প্রকৃত উদাহরণ রয়েছে?
RPallas

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

1
@ হেরঞ্জার মূলত, আমরা মডেলগুলি চালু করেছি - ওওপি কনস্ট্রাক্টসগুলি যা ডোমেন সত্তাকে প্রতিনিধিত্ব করে। এটি এই মডেলগুলি যা নিয়ন্ত্রকদের সাথে নয়, সংস্থানগুলির সাথে যোগাযোগ করে। তারা ডোমেন যুক্তি encapsulate। কন্ট্রোলাররা মডেলগুলিকে কল করে, যা পরিবর্তিত সংস্থানসমূহকে কল করে।
ইজাকি

1
@ আলেক্স ৪৪০ নং যদিও এই বিষয়টি নিয়ে একটি গুরুতর ব্লগ পোস্ট আমার আঙ্গুলের ডগায় এখন দুই মাস কেটে গেছে। ক্রিসমাস আসছে - সম্ভবত তখন।
ইজাকি

5

আর্টেমের উত্তরের দুর্দান্ত পরামর্শগুলির সাথে তুলনা করা একটি ছোটখাটো সমস্যা, তবে কোড পঠনযোগ্যতার পরিপ্রেক্ষিতে, আমি returnপিছু পিছু পিছু পিছু পিছু পিছু পিছু পিছু পিছু পিছু পিছু সংক্ষিপ্তকরণের জন্য আইটেমের ভিতরে সম্পূর্ণরূপে সংজ্ঞায়িত করলাম:

angular.module('myModule', [])
// or .constant instead of .value
.value('myConfig', {
  var1: value1,
  var2: value2
  ...
})
.factory('myFactory', function(myConfig) {
  ...preliminary work with myConfig...
  return {
    // comments
    myAPIproperty1: ...,
    ...
    myAPImethod1: function(arg1, ...) {
    ...
    }
  }
});

যদি returnঅবজেক্টটি "খুব ভিড়ের" হয়ে দেখা দেয় তবে এটি একটি লক্ষণ যে পরিষেবাটি খুব বেশি কাজ করছে।


0

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

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

ভিউমোডেল -> ভিউমোডেল হ'ল কৌণিক জেএস ক্ষেত্রে আপনার দৃষ্টিভঙ্গি এবং মডেলটির মধ্যে বাইন্ডার / সেতু এটি $ সুযোগ, আমরা কন্ট্রোলারটি ব্যবহার করি $ সুযোগটি আরম্ভ এবং বর্ধিত করি।

যদি আমি উত্তরটি সংক্ষিপ্ত করতে চাই: কৌণিক জেএস অ্যাপ্লিকেশন $ স্কোপটিতে ডেটার রেফারেন্স থাকে, কন্ট্রোলার আচরণটি নিয়ন্ত্রণ করে এবং দেখুন নিয়ন্ত্রকের সাথে ইন্টারঅ্যাক্ট করে লেআউটটি পরিচালনা করে সেই অনুযায়ী আচরণ করতে।


-1

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

সামগ্রিকভাবে এটি সমস্যাগুলি সমাধান করতে বিভিন্ন পরিচিত ডিজাইনের ধরণগুলি ব্যবহার করে।

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