ফ্লাইওয়েট প্যাটার্ন ব্যবহারের কারও কাছে কি নির্দিষ্ট উদাহরণ রয়েছে? [বন্ধ]


21

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

সংজ্ঞা অনুযায়ী এটি বলে:

দক্ষতার সাথে বিশাল সংখ্যক সূক্ষ্ম বস্তু সমর্থন করার জন্য ভাগ করে নেওয়া ব্যবহার করুন।

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

আগাম ধন্যবাদ.


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

9
মন্তব্য: আমি আশা করি যে যারা প্যাটার্ন এবং ওও বই এবং নিবন্ধগুলি লেখেন তারা গড় প্রোগ্রামারের আসল বিশ্বে আসেন এবং আইনজীবি স্টাইলের ইংরেজি ব্যবহার বন্ধ করে দেন!
NoChance

1
"আমাকে একবার বড় আকারের এক্সেল ফাইল তৈরি করতে হয়েছিল (
500 কিলোর্ড অবধি

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

জিডাব্লুটিটির টেবিল সেলগুলি ফ্লাইওয়েট।
ব্যবহারকারী16764

উত্তর:


19

একটি উদাহরণ জাভা গ্রন্থাগারগুলিতে। জাভাতে আদিম ধরণের রয়েছে (যেমন int, যা 32-বিট পূর্ণসংখ্যা) এবং তাদের জন্য Integerমোড়ক (যেমন , যা মোড়ানো int)। সেখানে "বাক্সটি" একটি থেকে পদ্ধতি intএকটি মধ্যে Integerএবং unbox Integerএকটি মধ্যে int। কারণ আদিম ধরনের নয় বস্তু এবং অত: পর যেমন মধ্যে কী হিসেবে ব্যবহার করা যেতে পারে চাদরে প্রয়োজনীয় Maps অথবা মধ্যে স্থাপন Collectionগুলি।

বক্সিং পদ্ধতিতে ফ্লাইওয়েট অবজেক্টগুলির একটি অ্যারে -128 এবং 127 এর মধ্যে মানগুলির Integerসাথে সম্পর্কিত এক ধরণের ক্যাশে হিসাবে ব্যবহার করে intSince যেহেতু মানগুলি কী হিসাবে ব্যবহৃত হতে পারে বা সংগ্রহগুলিতে রাখা হয় তাই এটি বরাদ্দ এবং মেমরির ব্যবহার হ্রাস করে। (যদি 5000000 Integerগুলি 0 টি প্রায় ভাসমান মান উপস্থাপন করে, যা ফ্লাইওয়েট উদাহরণটি পুনরায় ব্যবহার করার জন্য 5000000 গুণ বেশি মেমরি ব্যবহার করে)।



1
সুতরাং সি # তে স্ট্রিংগুলির জন্য ইন্টার্ন পুল ফ্লাইওয়েটের প্যাটার্নের আরও একটি উদাহরণ সঠিক?
জেরেমি ই

1
@ জেরেমি ই: হ্যাঁ, আমার মতে আপনি স্ট্রিংকে ফ্লাইওয়েট প্যাটার্ন প্রয়োগ করতে পারেন, স্ট্রিংয়ের জন্য যথেষ্ট পরিমাণে, এটি কেবল মেমরির খরচ নয়, রানটাইম দক্ষতা সম্পর্কেও বলা যেতে পারে।
ফ্যালকন

অবজেক্টিভ-সি ট্যাগযুক্ত পয়েন্টারগুলি এটিকে চরম দিকে নিয়ে যায়। 56 বিট অবধি পূর্ণ বাক্স এবং ছয়টি অক্ষর পর্যন্ত অনেকগুলি স্ট্রিং এমনকি অবজেক্ট হিসাবে বরাদ্দ করা হয় না, তবে সমস্ত তথ্যই বস্তু পয়েন্টারে নিজেই প্যাক করা হয়।
gnasher729

9

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


3

স্মলটালকের এএসসিআইআই-রেঞ্জের Characterদৃষ্টান্তগুলি ফ্লাইওয়েট।

আপনি যখন ভালো কিছু মূল্যায়ন Character space, Character class >> #value:, executes:

value: anInteger 
    "Answer the Character whose value is anInteger."

    anInteger > 255 ifTrue: [^self basicNew setValue: anInteger].
    ^ CharacterTable at: anInteger + 1.

ক্লাস ভেরিয়েবলটি CharacterTableএভাবে শুরু করা হয়:

initialize
    "Create the table of unique Characters, and DigitsValues."
    "Character initializeClassificationTable"

    CharacterTable ifNil: [
        "Initialize only once to ensure that byte characters are unique"
        CharacterTable := Array new: 256.
        1 to: 256 do: [:i | CharacterTable
            at: i
            put: (self basicNew setValue: i - 1)]].
    self initializeDigitValues

সুতরাং আপনি যখন একটি স্ট্রিং তৈরি করবেন তখন ASCII- রেঞ্জগুলি প্রতিবার নতুন তৈরি হওয়ার পরিবর্তে Characterআসবে CharacterTable


3

ফ্লাইওয়েট প্যাটার্নটি ব্যবহারের উদ্দেশ্য হ'ল অযৌক্তিক অবজেক্টের সূচনা এবং এর ফলে স্থান বাঁচানো। জিওএফ দ্বারা সংজ্ঞায়িত হিসাবে , কোনও জিনিসের দুটি রাষ্ট্র থাকতে পারে, অন্তর্নিহিত এবং বহির্মুখী রাষ্ট্র:

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

ধরে নিই যে আমরা একটি সাধারণ পাঠ্য সম্পাদক অ্যাপ্লিকেশন বিকাশ করতে চাই যেখানে প্রতিটি কলামে পাঠ্যের সমস্ত সারি এবং সারিতে অক্ষর থাকতে পারে।

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

ফ্লাইওয়েট প্যাটার্ন অনুসরণ করে, অক্ষরটি এখন পুনরায় ব্যবহারযোগ্য এবং বস্তুর নির্দিষ্ট তালিকা (ফ্লাইওয়েট পুল) থেকে সমস্ত ASCII চিহ্ন ( Characterবস্তু) রয়েছে যা থেকে বিষয়গুলি রেফারেন্স করা হচ্ছে ।

আমি এখানে দৃষ্টিভঙ্গি বর্ণনা করেছি:

এখানে চিত্র বর্ণনা লিখুন

'হ্যালো' মুদ্রণের জন্য, 5 Characterএর পরিবর্তে কেবল 4 টি অবজেক্টের প্রয়োজন Once একবার ফন্টটি পরিবর্তিত হয়ে গেলে কোনও নতুন অবজেক্টের প্রয়োজন হয় না; মনে রাখবেন যে আমরা অক্ষর শ্রেণিতে বহিরাগত অবস্থা সংরক্ষণ করে থাকলে এটি সম্ভব হত না , যেমন,

class Character
{
    char c;
    int Size;
    Font font;

    ....
}

বৃহত্তর ডেটাসেটে এই প্যাটার্নটি প্রয়োগ করা অ্যাপ্লিকেশনটির স্মৃতি জটিলতার ও অবজেক্টের পুনঃব্যবহারযোগ্যতার উপর উল্লেখযোগ্য অপ্টিমাইজেশনের দিকে নিয়ে যায়

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