বিভিন্ন উত্সের ধরণের এবং বিভিন্ন গন্তব্যের ধরণের ডেটা আমদানির জন্য নকশার প্যাটার্ন


14

আমাকে একটি আমদানি স্ক্রিপ্ট ডিজাইন করতে এবং তৈরি করতে হবে (সি # তে) যা নিম্নলিখিতগুলি পরিচালনা করতে পারে:

  • বিভিন্ন উত্স থেকে তথ্য পড়ুন (এক্সএমএল, এক্সএসএলএক্স, সিএসভি)
  • তথ্য যাচাই করুন
  • বিভিন্ন বস্তুর ধরণের (গ্রাহক, ঠিকানা) ডেটা লিখুন

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

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

এই সমস্যাটি সমাধান করার জন্য উপযুক্ত নকশার ধরণ কী?


সহজবোধ্য রাখো.
NoChance

উত্তর:


11

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

সহজবোধ্য রাখো. মৌলিক অনুশীলনগুলি ব্যবহার করুন।

  1. এক্সএমএল এর জন্য একটি পঠন, সিএসভি-র জন্য একটি পঠন করার মধ্যে সাধারণ জিনিসগুলি কল্পনা করার চেষ্টা করুন। নেক্সট রেকর্ড, পরবর্তী লাইন। যেহেতু নতুন ফর্ম্যাটগুলি যুক্ত করা যেতে পারে, তাই সাধারণতার কল্পনা করার চেষ্টা করুন যা নির্ধারিত ফর্ম্যাটটি পরিচিতগুলির সাথে থাকতে পারে। এই সাধারণতাটি ব্যবহার করুন এবং একটি 'ইন্টারফেস' বা একটি চুক্তি সংজ্ঞায়িত করুন যা সমস্ত ফর্ম্যাটকে মেনে চলতে হবে। যদিও তারা সাধারণ মাঠ মেনে চলে, তাদের সবার নিজস্ব নির্দিষ্ট অভ্যন্তরীণ নিয়ম থাকতে পারে।

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

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

আমি বলব এর মধ্যে বেশিরভাগ টেম্পলেট নিদর্শন বা কৌশল নিদর্শন। পুরো প্রকল্পটি একটি অ্যাডাপ্টার প্যাটার্ন হবে।


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

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

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

@ অ্যান্ডিজসমিট - আমার কোডে আমার অভিন্ন সমস্যা রয়েছে। আমি আপনার কোড সম্পর্কে সমস্ত অ্যাডাপ্টার প্যাটার্ন বাদে বুঝতে পেরেছিলাম। আপনি যখন বলেছিলেন পুরো প্রকল্পটি অ্যাডাপ্টার প্যাটার্নের উদাহরণ, আপনি কি তা চিত্রিত করতে পারেন?
গানসুব

9

সুস্পষ্ট বিষয় হ'ল কৌশল প্যাটার্ন প্রয়োগ করা । একটি জেনেরিক বেস ক্লাস আছে ReadStrategyএবং প্রতিটি ইনপুট বিন্যাসের মত একটি উপশ্রেণী XmlReadStrategy, CSVReadStrategyইত্যাদি এই আপনি verfication প্রক্রিয়াকরণ এবং আউটপুট প্রক্রিয়াকরণ থেকে স্বাধীনভাবে আমদানি প্রক্রিয়াকরণ পরিবর্তন করার অনুমতি দেবে।

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


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

@ জ্যাও: ভাল, আপনি যদি আমার উত্তরটি আবার পড়েন তবে আপনি দেখতে পাবেন যে আমার পরামর্শটি "রিডস্ট্রেটজি" তৈরি করার জন্য ছিল, "কনভার্টস্ট্রেটজি" নয়। সুতরাং আপনাকে কেবল অবজেক্টগুলি পড়ার জন্য বিভিন্ন পদ্ধতি লিখতে হবে (বা আপনার প্রক্রিয়াটির অতিরিক্ত অংশটি নির্দিষ্ট ফাইল ফর্ম্যাটের জন্য পৃথক)।
ডক ব্রাউন

7

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

প্রতিটি এমইএফ অংশ এমন কিছু স্ট্যান্ডার্ড পদ্ধতি যা আমদানি ফাইলের একটি সারিটিকে আপনার আউটপুট ডেটাতে রূপান্তর করে বা বুনিয়াদি কার্যকারিতা সহ একটি বেস শ্রেণিকে ওভাররাইড করে একটি আমদানি ইন্টারফেসকে সন্তুষ্ট করতে নির্মিত হতে পারে।

এমইএফ হ'ল একটি প্লাগ-ইন আর্কিটেকচার তৈরির জন্য একটি কাঠামো - এর দৃষ্টিভঙ্গি এবং ভিজ্যুয়াল স্টুডিও কীভাবে নির্মিত হয়, ভিএস-এ এই সমস্ত সুন্দর এক্সটেনশনগুলি এমইএফ অংশ parts

একটি এমইএফ (পরিচালিত এক্সটেনসিবিলিটি ফ্রেমওয়ার্ক) অ্যাপ্লিকেশন তৈরি করতে একটি রেফারেন্স সহ অন্তর্ভুক্ত করুন System.ComponentModel.Composition

রূপান্তরকারী কী করবে তা নির্দিষ্ট করতে ইন্টারফেসগুলি সংজ্ঞায়িত করুন

public interface IImportConverter
{
    int UserId { set; }        
    bool Validate(byte[] fileData, string fileName, ImportType importType);
    ImportResult ImportData(byte[] fileData, string fileName, ImportType importType);
}

আপনি যে ফাইল ফাইলটি আমদানি করতে চান তার জন্য এটি ব্যবহার করা যেতে পারে।

নতুন ক্লাসে এমন বৈশিষ্ট্য যুক্ত করুন যা শ্রেণিটি "রফতানি" করবে তা নির্ধারণ করে

[Export(typeof(IImportConverter))]
[MyImport(ImportType.Address, ImportFileType.CSV, "4eca4a5f-74e0")]
public class ImportCSVFormat1 : ImportCSV, IImportConverter
{
 ...interface methods...
}

এটি এমন একটি শ্রেণীর সংজ্ঞা দেবে যা সিএসভি ফাইলগুলি আমদানি করবে (একটি নির্দিষ্ট বিন্যাসের: ফর্ম্যাট 1) এবং একটি কাস্টম বৈশিষ্ট্য রয়েছে যা এমইএফ রফতানি অ্যাট্রিবিউট মেটাডেটা সেট করে। আপনি আমদানি করতে চান এমন প্রতিটি ফর্ম্যাট বা ফাইল টাইপের জন্য আপনি এটি পুনরুক্ত করতে চাই। আপনি যেমন শ্রেণীর সাথে কাস্টম বৈশিষ্ট্যগুলি সেট করতে পারেন:

[MetadataAttribute]
[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class ImportAttribute : ExportAttribute
{
    public ImportAttribute(ImportType importType, ImportFileType fileType, string customerUID)
        : base(typeof(IImportConverter))
    {
        ImportType = importType;
        FileType = fileType;
        CustomerUID = customerUID;
    }

    public ImportType ImportType { get; set; }
    public ImportFileType FileType { get; set; }
    public string CustomerUID { get; set; }
}

প্রকৃতপক্ষে MEF রূপান্তরকারীগুলি ব্যবহার করার জন্য আপনার রূপান্তরকারী কোডটি চালিত হওয়ার সময় আপনার তৈরি MEF অংশগুলি আমদানি করতে হবে:

[ImportMany(AllowRecomposition = true)]
protected internal Lazy<IImportConverter, IImportMetadata>[] converters { get; set; }
AggregateCatalog catalog = new AggregateCatalog();

catalog একটি ফোল্ডার থেকে অংশগুলি সংগ্রহ করে, ডিফল্ট অ্যাপ্লিকেশন অবস্থান।

converters আমদানিকৃত এমইএফ অংশগুলির একটি অলস তালিকা

তারপরে আপনি যখন জানেন যে কোন ধরণের ফাইলটি আপনি রূপান্তর করতে চান ( importFileTypeএবং importType) এর মধ্যে আমদানিকৃত অংশগুলির তালিকা থেকে একটি রূপান্তরকারী পানconverters

var tmpConverter = (from x in converters
                    where x.Metadata.FileType == importFileType
                    && x.Metadata.ImportType == importType 
                    && (x.Metadata.CustomerUID == import.ImportDataCustomer.CustomerUID)
                    select x).OrderByDescending(x => x.Metadata.CustomerUID).FirstOrDefault();

if (tmpConverter != null)
{
     var converter = (IImportConverter)tmpConverter.Value;
     result = converter.ImportData(import.ImportDataFile, import.ImportDataFileName, importType);
....
}

কল করার converter.ImportDataজন্য আমদানিকৃত শ্রেণিতে কোডটি ব্যবহার করা হবে।

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


আমি এর আগে এমইএফ এর কথা শুনিনি। এটা কি?
জাও

2
সম্পূর্ণ বিবরণের জন্য @ জাও লিঙ্কটি দেখুন check আমার উত্তরে কিছু উদাহরণ এমইএফ স্টাফ যুক্ত করেছে।
ম্যাট

1
এটি এমইএফ থেকে শুরু করার একটি দুর্দান্ত উপায়। +1
পাকোগোমেজ

এমইএফ একটি প্রযুক্তি, নকশার ধরণ নয়। -1অন্তর্নিহিত ধারণাটি এখনও ধারণা তৈরি করে এবং IImportConverterইন্টারফেস দ্বারা নিয়ন্ত্রিত একটি কৌশল প্যাটার্নের উপর নির্ভর করে বলে আমার কাছ থেকে কোনও নয় ।
GETah

0

এই সমস্যাটি সমাধান করার জন্য উপযুক্ত নকশার ধরণ কী?

সি # আইডিয়ামগুলি এটি করার জন্য বিল্ট ইন সিরিয়ালাইজেশন ফ্রেমওয়ার্কটি ব্যবহার করে। আপনি মেটাডেটা সহ অবজেক্টগুলিকে টীকায়িত করুন এবং তারপরে বিভিন্ন সিরিয়ালাইজারগুলি ইনস্ট্যান্ট করুন যা সঠিকভাবে ফর্মের মধ্যে রাখার জন্য ডেটা ছিঁড়ে ফেলার জন্য এই টীকাগুলি ব্যবহার করে বা তার বিপরীতে।

এক্সএমএল, জেএসএন, এবং বাইনারি ফর্মগুলি সর্বাধিক সাধারণ, তবে অন্যটি ইতিমধ্যে আপনার গ্রাস করার জন্য একটি সুন্দর প্যাকেজড ফর্মটিতে উপস্থিত থাকলে আমি অবাক হব না।


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

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

@ ডকব্রাউন - কিভাবে? ধারণামূলকভাবে, এক্সেলের একটি কক্ষের একটি সিরিজে কোনও বস্তুকে পরিণত করা এটি কোনও এক্সএমএল ডকুমেন্টে রূপান্তরিত করার চেয়ে আসলে আলাদা নয়।
টেলাস্টিন

@ টেলাস্টিন: আপনি বলেছেন যে আপনি এক্সএলএসএক্স ফর্ম্যাটটি পড়ার জন্য .NET ফ্রেমওয়ার্কের বিল্ট ইন সিরিয়ালাইজেশন কাঠামোটি ব্যবহার করতে পারেন ? যদি এটি সত্য হয় তবে ওপেন এক্সএমএল এসডিকে বা এনপিওআইয়ের মতো গ্রন্থাগারগুলি অচল ছিল।
ডক ব্রাউন

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