সফ্টওয়্যারের বিভিন্ন সংস্করণের মধ্যে ফাইলগুলির পিছনে সামঞ্জস্যতা মঞ্জুর করার জন্য একটি ভাল নকশা কী?


14

সফ্টওয়্যার বিভিন্ন সংস্করণ মধ্যে একটি ফাইল টাইপ পিছনে সামঞ্জস্য করার জন্য একটি ভাল নকশা কি?

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

আমি বোঝাতে চাইছি এটি করার প্রকৃত উপায় হ'ল এটির মতো কিছু থাকা

private string openfile(string filename)
{
    File.Open(filename)

    ... some logic that gets a header from the file that will never change

    switch (fileversion)
        case 2007:
            .....
        case 2010
            .....
        case 2013
            .....
}

তবে এটি অবিশ্বাস্যরকম একচেটিয়া বলে মনে হয়, খুব অবিশ্বাস্য নয় এবং এটি অনেকগুলি অনুলিপি / পেস্ট কোডের দিকে নিয়ে যায়।

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

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


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

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

1
হ্যাঁ, সংস্করণ নম্বরটি সর্বদা ফাইল শিরোনামে থাকবে এবং শিরোনামের বিন্যাসটি কখনও পরিবর্তন হবে না। আমরা এই ধারণার সাথে যাচ্ছি যে ছোটখাটো সফ্টওয়্যার রিভিশনগুলির মধ্যে তৈরি ফাইলগুলি সামঞ্জস্যপূর্ণ হওয়া উচিত, অর্থাত v1.1-এ তৈরি করা ফাইল v1.2 এবং এর বিপরীতে খোলা যেতে পারে, যদিও 1.2 থেকে কিছু কার্যকারিতা 1.1 এ অনুপস্থিত হতে পারে তবে বড় সংশোধনীগুলি ফরোয়ার্ডের সামঞ্জস্যতা ভেঙে দেবে, সুতরাং ভি 2-তে লিখিত জিনিসগুলি ভি 1-তে খোলা হবে না, তবে ভি 1-তে লিখিত জিনিসগুলি v2-তে খোলা হবে।
জেজেবার্গেস

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

উত্তর:


10

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


ভালো বুদ্ধি! পিএনজি ফর্ম্যাট সংস্করণগুলিতে নয় বরং বৈশিষ্ট্যগুলির উপর নির্ভর করে। তবে এর অর্থ এই যে, মৌলিক ফর্ম্যাটটি কখনই পরিবর্তন করা উচিত। (বৈশিষ্ট্য সংজ্ঞায়িত হেডার অর্থাৎ।)
ফ্লোরিয়ান Margaine

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

3

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


এটির সাথে আমার একমাত্র সমস্যাটি হ'ল আপনি পরবর্তী প্রতিটি সংশোধনের জন্য ডুপ্লিকেট সংস্করণ নির্দিষ্ট প্রয়োগটি শেষ করবেন implementation বলুন আপনার কাছে তিনটি বেস ক্লাসের পদ্ধতি রয়েছে: রিডনাম (), রিডএজেস () এবং রিডএড্রেসস () এবং ক্লাসের ভি 2 এ, আপনি রিডএজেস () এ পরিবর্তন করেন। যদি ভি 3-তে থাকে তবে আপনি পঠনামে পরিবর্তন করুন () পরিবর্তন করুন, যদি আপনার সংস্করণ নির্দিষ্ট শ্রেণীর সমস্তগুলি বেস থেকে উত্তরাধিকার সূত্রে আসে, আপনি আপনার ভি 2 পরিবর্তনগুলি হারাতে পারেন, বা আপনাকে ভি 2 থেকে পরিবর্তনগুলি অনুলিপি / আটকানো দরকার ভি 3 বাস্তবায়নের পাশাপাশি।
জেজেবার্গেস

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

2

আমি এক্সএমএল দিয়ে এটি করেছি এবং এটি ভালভাবে কাজ করে:

আপনার ডকুমেন্টের যে কোনও উপাদানকে কোনও বৈশিষ্ট্য এবং কোনও অত্যাবশ্যক (এবং যখন অর্ডার গুরুত্বপূর্ণ নয় - কোনও ক্রমে) রাখার জন্য কেবল অনুমতি দিন। প্রোগ্রামের প্রথম সংস্করণ থেকে শুরু করে - দস্তাবেজটি পড়ার সময়, এমন বৈশিষ্ট্য এবং উপ-উপাদানগুলি উপেক্ষা করুন যা আপনি বর্তমান সংস্করণে জানেন না।

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

উদাহরণস্বরূপ আপনার পাঠ্য সহ কিছু আইটেম রয়েছে:

<item text="Hello, world!"/>

এবং আরও নতুন সংস্করণে আপনি আইটেমটিতে রঙ যুক্ত করতে চান যাতে আপনি বৈশিষ্ট্য যুক্ত করেন color:

<item text="Hello, world!" color="008000"/>

colorডকুমেন্ট খোলার সময় পুরানো সংস্করণ কেবল বৈশিষ্ট্যটিকে উপেক্ষা করবে ignore নতুন সংস্করণগুলি colorঅ্যাট্রিবিউটের উপস্থিতি পরীক্ষা করে এবং যদি তা না থাকে তবে ডিফল্ট রঙ নির্ধারণ করে।

এই সাধারণ সমাধানের সাথে আপনার উভয় পিছিয়ে এবং সামনের সামঞ্জস্য থাকবে।


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

@ মার্ক হুদার: হ্যাঁ, আমি নিঃশব্দে ধরে নিচ্ছি যে পশ্চাদপটে সামঞ্জস্যতা অবশ্যই হবে এবং সামনের সামঞ্জস্য বোনাস। অ্যাপ্লিকেশনগুলির পুরানো সংস্করণে যখন কেউ নতুন দস্তাবেজ খুলবে তখন তারা আশ্চর্য হবেন না যে তারা যখন এটি সংরক্ষণ করে তখন তারা এমন কিছু হারিয়ে ফেলে যা পুরানো অ্যাপ্লিকেশনটিতে ইতিমধ্যে দৃশ্যমান নয়। অতিরিক্ত লজিক আমার কাছে ওভাররেঞ্জিনারেড বলে মনে হচ্ছে।
user3123061
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.