"সবকিছুই একটি মানচিত্র", আমি কি এটি সঠিকভাবে করছি?


69

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

  • ক্লোজার হ'ল আইডেমিক্যালি ফাংশনাল প্রোগ্রামিং
  • বেশিরভাগ রাজ্য অপরিবর্তনীয়

আমি "সবকিছুই একটি মানচিত্র" স্লাইড (11 মিনিট, 6 সেকেন্ড থেকে> 29 মিনিটের মধ্যে) স্লাইডটি থেকে ধারণা নিয়েছি। কিছু জিনিস যা সে বলে:

  1. আপনি যখনই কোনও ফাংশন দেখতে পান যেখানে ২-৩ টি আর্গুমেন্ট লাগে, আপনি এটিকে মানচিত্রে পরিণত করার জন্য এবং কেবল একটি মানচিত্রকে পাস করার জন্য একটি কেস তৈরি করতে পারেন to এর অনেক সুবিধা রয়েছে:
    1. যুক্তি আদেশ সম্পর্কে আপনাকে চিন্তা করতে হবে না
    2. কোনও অতিরিক্ত তথ্য সম্পর্কে আপনাকে চিন্তা করতে হবে না। যদি অতিরিক্ত কী থাকে তবে তা আমাদের উদ্বেগ নয়। এগুলি কেবল প্রবাহিত হয়, তারা হস্তক্ষেপ করে না।
    3. আপনাকে স্কিমা সংজ্ঞায়িত করতে হবে না
  2. কোনও অবজেক্টে যাওয়ার বিপরীতে কোনও তথ্য গোপন নেই। তবে, তিনি কেসটি তৈরি করেন যে ডেটা লুকানো সমস্যার কারণ হতে পারে এবং ওভাররেটেড হয়:
    1. কর্মক্ষমতা
    2. বাস্তবায়নের সহজতা
    3. নেটওয়ার্ক বা প্রক্রিয়াগুলি জুড়ে আপনি যোগাযোগ করার সাথে সাথেই আপনাকে উভয় পক্ষই উপাত্ত উপস্থাপনায় যেভাবেই হোক তাতে সম্মত হতে হবে। এটি অতিরিক্ত কাজ আপনি যদি কেবলমাত্র ডেটাতে কাজ করেন তবে আপনি এড়াতে পারবেন।
  3. আমার প্রশ্নের সাথে সর্বাধিক প্রাসঙ্গিক। এটি 29 মিনিটের মধ্যে: "আপনার ফাংশনগুলি রচনাযোগ্য করুন"। ধারণাটি ব্যাখ্যা করতে তিনি যে কোড কোডটি ব্যবহার করেন তা এখানে:

    ;; Bad
    (defn complex-process []
      (let [a (get-component @global-state)
            b (subprocess-one a) 
            c (subprocess-two a b)
            d (subprocess-three a b c)]
        (reset! global-state d)))
    
    ;; Good
    (defn complex-process [state]
      (-> state
        subprocess-one
        subprocess-two
        subprocess-three))
    

    আমি বুঝতে পেরেছি যে বেশিরভাগ প্রোগ্রামার ক্লোজারের সাথে পরিচিত নয়, তাই আমি এটি আবশ্যক স্টাইলে আবার লিখব:

    ;; Good
    def complex-process(State state)
      state = subprocess-one(state)
      state = subprocess-two(state)
      state = subprocess-three(state)
      return state
    

    এখানে সুবিধা রয়েছে:

    1. পরীক্ষা সহজ
    2. বিচ্ছিন্নভাবে এই ফাংশনগুলি দেখতে সহজ
    3. এর একটি লাইন মন্তব্য করা সহজ এবং একটি একক পদক্ষেপ সরিয়ে ফলাফল কী হবে তা দেখুন
    4. প্রতিটি সাব-প্রসেস রাজ্যে আরও তথ্য যুক্ত করতে পারে। সাবপ্রসেস যদি তিনটি উপ-প্রসেসের জন্য কোনও কিছুতে যোগাযোগের প্রয়োজন হয় তবে এটি কী / মান যুক্ত করার মতোই সহজ।
    5. আপনার রাজ্যের বাইরে থাকা ডেটাগুলি বের করার জন্য কোনও বয়লারপ্লেট নেই যাতে আপনি এটিকে আবার ফিরিয়ে দিতে পারেন Just পুরো রাজ্যে কেবল পাস করুন এবং সাবপ্রসেসটিকে যা প্রয়োজন তা নির্ধারণ করুন।

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

update(gameState)
  ...
  gameState = handleUnitCollision(gameState)
  ...
  gameState = handleLoot(gameState)
  ...

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

আমি উদ্বিগ্ন যে একদিন আমি জেগে উঠব এবং উপলব্ধি করব যে এই পুরো নকশাটি একটি লজ্জাজনক এবং আমি সত্যিই কেবলমাত্র বিগ বল অফ কাদার বিরোধী প্যাটার্ন বাস্তবায়ন করছি ।


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

হালনাগাদ

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

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

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

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

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

রেফারেন্স বাস্তবায়ন (যেমন: স্কিমা) দেখার জন্য একটি জায়গা রয়েছে। এই রেফারেন্স বাস্তবায়নটি কোডটি গেমটি ব্যবহার করে তাই এটি তারিখের বাইরে যেতে পারে না।

দ্বিতীয় দফার হিসাবে, আমি রেফারেন্স বাস্তবায়নের বাইরে মানচিত্রে কীগুলি যুক্ত / সরান না, ইতিমধ্যে যা আছে তা আমি কেবল পরিবর্তন করি mut আমার কাছে স্বয়ংক্রিয় পরীক্ষার একটি বড় স্যুটও রয়েছে।

যদি এই স্থাপত্যটি শেষ পর্যন্ত তার নিজের ওজনের নীচে পড়ে যায় তবে আমি একটি দ্বিতীয় আপডেট যুক্ত করব। অন্যথায়, ধরে নিন সবকিছু ঠিকঠাক চলছে :)


2
দুর্দান্ত প্রশ্ন (+1)! অ-কার্যক্ষম (বা খুব দৃ strongly়ভাবে কার্যকর নয়) ভাষায় ফাংশনাল আইডিয়ামগুলি প্রয়োগ এবং প্রয়োগ করার জন্য আমি এটি খুব দরকারী অনুশীলন বলে মনে করি।
জর্জিও

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

4
@ ম্যাসনওহিলার আপনাকে এই বিষয়ে সঠিক বলেছে। এই কারণটি ভুল হওয়ার কারণে তিনি যে প্রতিদ্বন্দ্বিতা করেছেন তা আপনি বাতিল করতে যাচ্ছেন?
ড্যানিয়েল ক্যাপলান

9
পাইথনে (এবং আমি জাভাস্ক্রিপ্ট সহ বেশিরভাগ গতিশীল ভাষাগুলি বিশ্বাস করি) অবজেক্টটি যাইহোক, ডিক / মানচিত্রের জন্য সত্যিই কেবল সিনট্যাক্স চিনির মতো is
মিথ্যা রায়ান

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

উত্তর:


42

আমি এমন একটি অ্যাপ্লিকেশন সমর্থন করেছি যেখানে আগে 'সবকিছুই একটি মানচিত্র'। এটি একটি ভয়ানক ধারণা। দয়া করে এটি করবেন না!

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

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

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

সম্পাদনা - উদাহরণ

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

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

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

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

কোডটি কার্যকরভাবে একটি একঘেয়ে মেস ছিল, আপনাকে মানচিত্রের মধ্যে একটি একক প্রবেশ কোথা থেকে এসেছে তা সম্পূর্ণরূপে বুঝতে হবে।


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

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

28

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

উদাহরণস্বরূপ, প্রতিটি সাব-প্রসেস ফাংশন সম্পর্কে নিম্নলিখিত প্রশ্নের উত্তর দেওয়ার চেষ্টা করুন:

  • এটি কোন ক্ষেত্রের stateপ্রয়োজন?
  • এটি কোন ক্ষেত্রগুলি সংশোধন করে?
  • কোন ক্ষেত্র অপরিবর্তিত?
  • আপনি কি ফাংশনগুলির ক্রমটি নিরাপদে পুনর্বিন্যাস করতে পারেন?

এই নিদর্শন দিয়ে, আপনি পুরো ফাংশনটি না পড়ে এই প্রশ্নের উত্তর দিতে পারবেন না।

কোনও অবজেক্ট ওরিয়েন্টেড ভাষায়, প্যাটার্নটি আরও কম বোঝায়, কারণ ট্র্যাকিংয়ের অবস্থা যা বস্তুগুলি করে।


2
"অপরিবর্তনীয়তার সুবিধাগুলি আপনার অপরিবর্তনীয় বস্তুগুলি যে পরিমাণে বড় হবে" কেন? এটি কি পারফরম্যান্স বা রক্ষণাবেক্ষণের বিষয়ে মন্তব্য? দয়া করে এই বাক্যটি বিস্তারিতভাবে বর্ণনা করুন।
ড্যানিয়েল ক্যাপলান

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

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

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

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

12

আপনি যা করছেন বলে মনে হচ্ছে তা কার্যকরভাবে একটি ম্যানুয়াল স্টেট মোনাদ; আমি যা করব তা হ'ল একটি (সরল) বাঁধাই সংযোজক এবং এটি ব্যবহার করে আপনার যৌক্তিক পদক্ষেপগুলির মধ্যে সংযোগগুলি পুনরায় প্রকাশ করুন:

function stateBind() {
    var computation = function (state) { return state; };
    for ( var i = 0 ; i < arguments.length ; i++ ) {
        var oldComp = computation;
        var newComp = arguments[i];
        computation = function (state) { return newComp(oldComp(state)); };
    }
    return computation;
}

...

stateBind(
  subprocessOne,
  subprocessTwo,
  subprocessThree,
);

এমনকি stateBindসাব-প্রোসেসেসগুলি থেকে বিভিন্ন উপ-প্রসেসগুলি তৈরি করতে, এবং আপনার গণনাটি যথাযথভাবে গঠনের জন্য বাঁধাই সংযুক্তকারীগুলির একটি গাছ অবিরত রাখতে পারেন।

পূর্ণ, অব্যক্ত রাজ্য মোনাডের ব্যাখ্যা এবং জাভাস্ক্রিপ্টে সাধারণভাবে মনডদের একটি দুর্দান্ত পরিচিতির জন্য এই ব্লগ পোস্টটি দেখুন


1
ঠিক আছে, আমি এটি সন্ধান করব (এবং পরে এটিতে মন্তব্য করব)। কিন্তু প্যাটার্নটি ব্যবহার করার ধারণা সম্পর্কে আপনি কী ভাবেন?
ড্যানিয়েল ক্যাপলান

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

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

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

1
@ লাইরিয়ান প্রথম প্যাথারিনের ভাষ্য দ্বিতীয় - বেশিরভাগ মনাদ রাজ্য বা পরিবর্তন সম্পর্কিত নয়, এমনকি এটি একটিও, বিশ্বব্যাপী রাষ্ট্র সম্পর্কে নয় । মনডস আসলে ওও / আবশ্যক / পরিবর্তনীয় ভাষাতে বেশ ভাল কাজ করে।

11

সুতরাং, ক্লোজুরে এই পদ্ধতির কার্যকারিতার মধ্যে অনেক আলোচনা হতে পারে। আমি মনে করি যে তিনি এইভাবে ডেটা বিমূর্তি সমর্থন করার জন্য ক্লোজারকে কেন তৈরি করেছিলেন তা সম্পর্কে রিচ হিকির দর্শনের দিকে নজর রাখা কার্যকর হতে পারে :

ফোগাস: সুতরাং একবার ঘটনামূলক জটিলতা হ্রাস পেয়েছে, ক্লোজার কীভাবে সমস্যা সমাধানে সহায়তা করতে পারে? উদাহরণস্বরূপ, আদর্শিক বস্তু-ভিত্তিক দৃষ্টান্তটি পুনরায় ব্যবহারের জন্য উত্সাহিত করার জন্য বোঝানো হয়েছে, তবে ক্লোজুর ক্লাসিকভাবে বস্তু-ভিত্তিক নয় we আমরা কীভাবে পুনরায় ব্যবহারের জন্য আমাদের কোডটি গঠন করতে পারি?

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

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

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

ফোগাস তাঁর ফাংশনাল জাভাস্ক্রিপ্ট বইটিতে এই বিষয়গুলি পুনর্বার করেছেন :

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

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

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


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

9

শয়তানের উকিল

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

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

উদাহরণস্বরূপ, প্রতিটি সাব-প্রসেস ফাংশন সম্পর্কে নিম্নলিখিত প্রশ্নের উত্তর দেওয়ার চেষ্টা করুন:

  • রাষ্ট্রের কোন ক্ষেত্রের এটির প্রয়োজন?

  • এটি কোন ক্ষেত্রগুলি সংশোধন করে?

  • কোন ক্ষেত্র অপরিবর্তিত?

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

  1. ডকুমেন্টেশন পড়ুন
  2. ফাংশন বডি তাকান
  3. পরীক্ষা দেখুন
  4. অনুমান করুন এবং প্রোগ্রামটি কাজ করে কিনা তা চালনা করুন।

আমি মনে করি না "সবকিছুই একটি মানচিত্র" প্যাটার্নটি এখানে কোনও পার্থক্য করে। এই প্রশ্নগুলির উত্তর জানার জন্য আমি এখনও জানি ways

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

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

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

  • আপনি কি ফাংশনগুলির ক্রমটি নিরাপদে পুনর্বিন্যাস করতে পারেন?

আমার কোডে, হ্যাঁ @ এভিকাটোসের উত্তরে আমার দ্বিতীয় মন্তব্য দেখুন। সম্ভবত এটি কেবল কারণ আমি একটি গেম তৈরি করছি যদিও, আমি বলতে পারি না। একটি খেলা যে 60x একটি দ্বিতীয় আপডেট এর দশকে, এটা সত্যিই যদি কোন ব্যাপার না dead guys drop lootতারপর good guys pick up lootবা তদ্বিপরীত। প্রতিটি ক্রিয়াকলাপ এখনও চালায় তার ক্রম নির্বিশেষে যা করা উচিত তা ঠিক তা করে। updateযদি আপনি অর্ডারটি অদলবদল করেন তবে একই ডেটা কেবল তাদের কাছে আলাদা কলগুলিতে খাওয়ানো হবে । আপনার যদি তা থাকে good guys pick up lootতবে dead guys drop lootভাল লোকেরা পরের দিকে লুটটি তুলে নেবে updateএবং এটি কোনও বড় বিষয় নয়। একজন মানুষ পার্থক্যটি লক্ষ্য করতে সক্ষম হবে না।

কমপক্ষে এটি আমার সাধারণ অভিজ্ঞতা ছিল। আমি প্রকাশ্যে এটিকে স্বীকার করে নিচ্ছি বলে আমি সত্যিই দুর্বল বোধ করছি। এটি এটিকে ঠিক হিসাবে বিবেচনা করা একটি খুব , খুব খারাপ কাজ। আমি যদি এখানে কিছু ভয়ানক ভুল করে থাকি তবে আমাকে জানান। কিন্তু, আমি যদি আছে, এটা অত্যন্ত সহজ ফাংশন নতুন করে সাজানো যাতে অর্ডার হয় dead guys drop lootতারপর good guys pick up lootআবার। এই অনুচ্ছেদটি লিখতে যে সময় লেগেছে তার চেয়ে কম সময় লাগবে: পি

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

এই নিদর্শনটির সাথে ডিকোপলড স্টেপগুলি লেখা স্বাভাবিক, তবে আপনার coupতিহ্যবাহী ওওপিতে যুগল পদক্ষেপগুলি লক্ষ্য করা শক্ত। যদি আমি প্রথাগত গলি লেখা হয়েছিল, প্রাকৃতিক, চিন্তা সাদাসিধা পথ পরিষ্কার করা হয় dead guys drop lootরিটার্ন একটি Lootবস্তুর আমি মধ্যে পাস করতে হবে যে good guys pick up loot। প্রথমটি দ্বিতীয়টির ইনপুট ফেরত দেওয়ার পরে আমি এই ক্রিয়াকলাপগুলিকে পুনঃক্রম করতে সক্ষম হব না।

কোনও অবজেক্ট ওরিয়েন্টেড ভাষায়, প্যাটার্নটি আরও কম বোঝায়, কারণ ট্র্যাকিংয়ের অবস্থা যা বস্তুগুলি করে।

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

এছাড়াও, অপরিবর্তনীয়তার সুবিধাগুলি আপনার অপরিবর্তনীয় বস্তু যত বড় হবে তা হ্রাস পাবে।

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


4
"কোনও ফাংশনের প্রথম পরামিতিটির নাম ফু হতে পারে, তবে এটি কী?" এজন্য আপনি আপনার পরামিতিগুলির নাম "ফু" রাখেন না, তবে "পুনরাবৃত্তি", "পিতামাতার" এবং অন্যান্য নামগুলি যা ফাংশন নামের সাথে মিলিত হওয়ার পরে কী প্রত্যাশিত তা প্রতীয়মান করে।
সেবাস্তিয়ান রেডল

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

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

8

আমি খুঁজে পেয়েছি যে আমার কোডটি এর মতো কাঠামোয় শেষ হতে থাকে:

  • যে কাজগুলি মানচিত্রগুলি নেয় সেগুলি বড় হতে থাকে এবং এর পার্শ্ব প্রতিক্রিয়াও ঘটে।
  • যুক্তিগুলি গ্রহণ করে এমন ফাংশনগুলি ছোট এবং খাঁটি থাকে are

আমি এই পার্থক্যটি তৈরি করতে প্রস্তুত হইনি তবে প্রায়শই এটি আমার কোডে শেষ হয়। আমি মনে করি না যে একটি স্টাইল ব্যবহার করা অপরিহার্যভাবে অন্যটিকে উপেক্ষা করে।

খাঁটি ফাংশন ইউনিট পরীক্ষা করা সহজ। মানচিত্রযুক্ত বৃহত্তরগুলি "সংহতকরণ" পরীক্ষার ক্ষেত্রে আরও বেশি পায় কারণ তারা আরও চলমান অংশগুলিকে জড়িত করে।

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

উদাহরণ স্বরূপ,

function foo (post) {
  check(post, {
    text: String,
    timestamp: Date,
    // Optional, but if present must be an array of strings
    tags: Match.Optional([String])
    });

  // do stuff
}

আরও জানতে http://docs.meteor.com/#match দেখুন।

:: হালনাগাদ ::

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


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

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

5

এই অনুশীলনের বিরুদ্ধে আমি যে মূল যুক্তিটি ভাবতে পারি তা হ'ল একটি ফাংশন আসলে কী ডেটা প্রয়োজন তা বলা খুব কঠিন।

এর অর্থ হ'ল কোডবেসে ভবিষ্যতের প্রোগ্রামারদের জানতে হবে যে ফাংশনটি ডাকা হচ্ছে এটি অভ্যন্তরীণভাবে কীভাবে কাজ করে - এবং কোনও নেস্টেড ফাংশন কল - এটি কল করার জন্য।

আমি এটির বিষয়ে যত বেশি চিন্তা করি ততই আপনার গেমস্টেট অবজেক্টটি গ্লোবালের মতো গন্ধ পাবে। যদি এটি এভাবে ব্যবহার করা হচ্ছে তবে কেন এটি চারপাশে পাস করবেন?


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

1
বিটিডব্লিউ: পুনরায়: এর বিরুদ্ধে মূল যুক্তি: এটি ক্লোজার বা জাভাস্ক্রিপ্টে ছিল কিনা তা সত্য বলে মনে হচ্ছে। তবে এটি একটি মূল্যবান বিষয়। সম্ভবত তালিকাভুক্ত সুবিধাগুলি এর নেতিবাচক তুলনায় অনেক বেশি।
ড্যানিয়েল ক্যাপলান

2
আমি এখন জানি কেন এটি বিশ্বব্যাপী পরিবর্তনশীল হওয়া সত্ত্বেও কেন আমি এটি পাস করতে বিরক্ত করি: এটি আমাকে খাঁটি ফাংশন লেখার অনুমতি দেয় । যদি আমার পরিবর্তন gameState = f(gameState)করতে f(), এটা আরো অনেক কিছু পরীক্ষা কঠিন ff()আমি যখনই কল করেছি তখনই কোনও ভিন্ন জিনিস ফিরে আসতে পারে। f(gameState)প্রতিবার যখন একই ইনপুট দেওয়া হয় তবে একই জিনিসটিকে রিটার্ন করা সহজ ।
ড্যানিয়েল ক্যাপলান

3

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

update(gameState)
  ...
  gameState = handleUnitCollision(gameState)
  ...
  gameState = handleLoot(gameState)
  ...

এবং

{
  ...
  handleUnitCollision: function() {
    ...
  },
  ...
  handleLoot: function() {
    ...
  },
  ...
  update: function() {
    ...
    this.handleUnitCollision()
    ...
    this.handleLoot()
    ...
  },
  ...
};

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


সম্পর্কিত, আরও সাধারণ প্রশ্নে [ প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জের / প্রশ্নগুলি
260309/…

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

আপনি এটি অবজেক্ট-ভিত্তিক প্রোগ্রামিং করছেন না, তবে এটি ঠিক আছে
ইউজার 7610

আপনি কীভাবে এই সিদ্ধান্তে পৌঁছলেন ("এটি ঠিক আছে" এক)?
ড্যানিয়েল ক্যাপলান

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

2

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

{ :face :queen :suit :hearts }

আমি তাদের পাশাপাশি দুটি মূলশব্দ উপাদানগুলির তালিকা বা ভেক্টর তৈরি করতে পারতাম। আমি জানি না এটি কোনও স্মৃতি / পারফরম্যান্সের পার্থক্য করে কিনা তাই আমি আপাতত মানচিত্র নিয়ে চলেছি।

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

(defn face [card] (card :face))
(defn suit [card] (card :suit))

যে প্রোগ্রাম বাকি ব্যবহার করে। কার্ডগুলি মানচিত্র হিসাবে ফাংশনগুলিতে প্রায় পাস হয়ে যায় তবে ফাংশনগুলি মানচিত্রে অ্যাক্সেস করার জন্য একটি সম্মতিযুক্ত ইন্টারফেস ব্যবহার করে এবং এতে বিশৃঙ্খলা তৈরি করতে সক্ষম হওয়া উচিত নয়।

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

class State
  def complex-process()
    state = clone(this) ; or just use 'this' below if mutation is fine
    state.subprocess-one()
    state.subprocess-two()
    state.subprocess-three()
    return state

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


2

আমি (সামান্য) যা দেখেছি, তার থেকে একক বৈশ্বিক অপরিবর্তনীয় রাষ্ট্রীয় বস্তু তৈরি করতে মানচিত্র বা অন্যান্য নেস্টেড স্ট্রাকচার ব্যবহার করে কার্যকরী ভাষায় কমপক্ষে খাঁটি বিষয়গুলি বিশেষত স্টেট মোনাডকে @ পিথারিয়েন এর ফ্ল্যাম হিসাবে ব্যবহার করার সময় সাধারণভাবে দেখা যায় mentioend

আমি কার্যকরভাবে দেখেছি / পড়েছি (এবং এখানে অন্যান্য উত্তর উল্লেখ করেছেন) এর কার্যকরভাবে এটি ব্যবহার করার জন্য দুটি রোধক হ'ল:

  • (স্থাবর) অবস্থায় একটি (গভীরভাবে) নেস্টেড মানটিকে পরিবর্তন করা ut
  • রাজ্যের বেশিরভাগ অংশকে এমন ফাংশনগুলি থেকে লুকিয়ে রাখা হচ্ছে যাগুলির প্রয়োজন নেই এবং কেবল তাদের সামান্য কিছু দেওয়ার / পরিবর্তনের জন্য তাদের প্রয়োজন

বিভিন্ন কৌশল / সাধারণ নিদর্শন রয়েছে যা এই সমস্যাগুলি হ্রাস করতে সহায়তা করতে পারে:

প্রথমটি জিপারস : এগুলি একটি অপরিবর্তনীয় নেস্টেড শ্রেণিবিন্যাসের গভীরে রাষ্ট্রের দিকে যেতে এবং পরিবর্তন করতে দেয়।

আর একটি হ'ল লেন্সগুলি : এগুলি আপনাকে কাঠামোটিতে নির্দিষ্ট স্থানে ফোকাস করতে দেয় এবং সেখানে মানটি পড়তে / পরিবর্তন করতে দেয়। বিভিন্ন জিনিসগুলিতে ফোকাস করার জন্য আপনি বিভিন্ন লেন্স একত্রিত করতে পারেন, ওওপি-তে অ্যাডজাস্টেবল প্রপার্টি চেইনের মতো (যেখানে আপনি প্রকৃত সম্পত্তির নামের জন্য ভেরিয়েবল প্রতিস্থাপন করতে পারেন!)

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

ওম কার্সার ব্যবহার করে এনক্যাপসুলেশন এবং মডুলারিটি পুনরুদ্ধার করে। কার্সাররা অ্যাপ্লিকেশন রাজ্যের নির্দিষ্ট অংশে (অনেকটা জিপার্সের মতো) আপডেট-সক্ষম উইন্ডোজ সরবরাহ করে, উপাদানগুলিকে কেবল বৈশ্বিক রাষ্ট্রের প্রাসঙ্গিক অংশগুলির রেফারেন্স নিতে সক্ষম করে এবং প্রসঙ্গমুক্ত পদ্ধতিতে সেগুলি আপডেট করে update

আইআইআরসি, তারা সেই পোস্টে জাভাস্ক্রিপ্টে অপরিবর্তনীয়তার বিষয়ে স্পর্শ করে।


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

@ ইউজার Good76১০ ভাল ধরা, আমি বিশ্বাস করতে পারি না যে আমি এটির কথা বলতে ভুলে গিয়েছি - আমি সেই ফাংশনটি পছন্দ করি (এবং এটি assoc-in)। অনুমান আমি সবেমাত্র মস্তিষ্কে হাস্কেল ছিল। আমি ভাবছি কেউ এর একটি জাভাস্ক্রিপ্ট পোর্ট করেছে কিনা? লোকেরা সম্ভবত এটি আনেনি কারণ (আমার মত) তারা
পল

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

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

1

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

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

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


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

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

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

1
আপনার পরীক্ষাগুলি পাস এবং কোনও খারাপ প্রভাব লক্ষ্য না করার অর্থ এই যে আপনি বর্তমানে অন্য কোনও স্থানে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়াযুক্ত এমন কোনও রাষ্ট্রকে পরিবর্তন করছেন না। যেহেতু আপনার কার্যগুলি বিশুদ্ধ নয় যদিও আপনার কোনও গ্যারান্টি নেই যা সর্বদা ক্ষেত্রে থাকবে। আমি মনে করি আপনার কার্যকারিতা খাঁটি নয় তবে আপনি প্রতিটি পদক্ষেপের পরে আপনার পুরানো ডেটা ফেলে দিচ্ছেন তবে আমি অবশ্যই আপনার বাস্তবায়ন সম্পর্কে মৌলিকভাবে কিছু ভুল বুঝাবুঝি।
এভিকাটোস

1
@ এভিকাটোস - খাঁটি হওয়া এবং একই স্বাক্ষর থাকা বোঝাচ্ছে না যে ক্রিয়াকলাপগুলির ক্রমটি বিবেচ্য নয়। স্থির এবং শতাংশ ছাড়ের প্রয়োগের সাথে মূল্য নির্ধারণের কল্পনা করুন। (-> 10 (- 5) (/ 2))2.5 প্রদান। (-> 10 (/ 2) (- 5))০.
জাক

1

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

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

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

@ পোলের পোস্টে বর্ণিত আপনি যদি "জিপার", "লেন্স" বা "কার্সার" দিয়ে যাচ্ছেন, তবে এটি একটি জিনিস। আপনি অ্যাক্সেস ধারণ করবেন এবং জিপার ইত্যাদির মাধ্যমে ডেটা পড়া এবং লেখাকে নিয়ন্ত্রণ করতে পারবেন।

একক দায়বদ্ধতা লঙ্ঘন "সাবপ্রসেস-ওয়ান", "সাবপ্রসেস-টু" এবং "সাবপ্রসেস-থ্রি" এর প্রত্যেকটির দাবী করা কেবলমাত্র একটি একক দায়িত্ব, যাহাতে এটিতে সঠিক মান সহ একটি নতুন বৈশ্বিক রাষ্ট্রীয় বস্তু উত্পাদন করা, হ'ল গুরুতর হ্রাস। সব শেষ বিট, তাই না?

এখানে আমার বক্তব্যটি হ'ল আপনার গেমের সমস্ত প্রধান উপাদান থাকা যেমন একই দায়িত্ব থাকে তেমনি আপনার গেমটি প্রতিনিধিদল এবং ফ্যাক্টরিংয়ের উদ্দেশ্যকে পরাস্ত করে।

সিস্টেম ইমপ্যাক্ট

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

দু'একটি বা আট বা অন্য কোনও প্রোগ্রামার যুক্ত করার ফলে আপনার সিস্টেমটি প্রায় সঙ্গে সঙ্গেই বিচ্ছিন্ন হয়ে যাবে।

  1. Objectsশ্বরের বস্তুগুলির জন্য শেখার বক্ররেখা সমতল (যেমন, এগুলিতে সক্ষম হয়ে উঠতে খুব দীর্ঘ সময় লাগে)। প্রতিটি অতিরিক্ত প্রোগ্রামারকে আপনার জানা সমস্ত কিছু শিখতে হবে এবং তাদের মাথায় রাখতে হবে। আপনি কেবল কখনও এমন প্রোগ্রামারদের ভাড়া নিতে সক্ষম হবেন যা আপনার চেয়ে ভাল are
  2. আপনার বিবরণে পরীক্ষার বিধান কেবল সাদা বাক্সে। পরীক্ষা স্থাপনের জন্য, এটি চালানোর জন্য এবং পরীক্ষার অধীনে থাকা মডিউলটির পাশাপাশি Youশ্বর বস্তুর প্রতিটি বিবরণ আপনার জানা দরকার, এবং এটি ক) সঠিক কাজটি করেছে এবং খ) এটি কোনও কাজ করেনি 10,000 ভুল জিনিস। প্রতিক্রিয়াগুলি আপনার বিরুদ্ধে প্রচুর পরিমাণে সজ্জিত।
  3. একটি নতুন বৈশিষ্ট্য যুক্ত করার জন্য আপনাকে ক) প্রতিটি উপ-প্রসেসের মধ্য দিয়ে যেতে হবে এবং নির্ধারণ করতে হবে যে বৈশিষ্ট্যটি এতে কোনও কোডকে প্রভাবিত করে এবং বিপরীতভাবে, খ) আপনার বিশ্বব্যাপী অবস্থার মধ্য দিয়ে যায় এবং সংযোজনগুলি ডিজাইন করে এবং গ) প্রতিটি ইউনিট পরীক্ষার মধ্য দিয়ে যায় এবং এটি সংশোধন করে পরীক্ষার অধীনে কোনও ইউনিট নতুন বৈশিষ্ট্যটিকে বিরূপভাবে প্রভাবিত করে না তা পরীক্ষা করতে

পরিশেষে

  1. পরিবর্তনীয় godশ্বর বস্তুগুলি আমার প্রোগ্রামিং অস্তিত্বের অভিশাপ, আমার নিজের কিছু কাজ, এবং কিছু যে আমি আটকা পড়েছি been
  2. রাজ্য মনাদ স্কেল করে না। রাষ্ট্র তাত্পর্যপূর্ণ এবং পরীক্ষামূলক ক্রিয়াকলাপের জন্য সমস্ত প্রচ্ছন্নতার সাথে তাত্পর্যপূর্ণভাবে বৃদ্ধি পায়। আধুনিক সিস্টেমগুলিতে আমরা রাষ্ট্রকে যেভাবে নিয়ন্ত্রণ করি তা হ'ল প্রতিনিধি (দায়িত্ব বিভাজন) এবং স্কোপিং (কেবলমাত্র রাজ্যের একটি উপসেটে অ্যাক্সেসকে সীমাবদ্ধ করা) by "সবকিছুই একটি মানচিত্র" পদ্ধতির নিয়ন্ত্রণ রাষ্ট্রের ঠিক বিপরীত।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.