কৌশল প্যাটার্ন ব্যবহার করে জাভাতে জেনেরিক ফাইল পার্সার ডিজাইন


14

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

এতক্ষণ আমি কী চেষ্টা করেছি? (বর্তমান) আমার নিম্নলিখিত নকশাগুলি মনে আছে যা কৌশল প্যাটার্নের উপর ভিত্তি করে। আমি আমার ডিজাইনটি জানাতে দ্রুতই কোডটি গ্রহনে লিখে রেখেছি যাতে ব্যতিক্রমগুলি পরিচালনা করার সঠিক উপায়ের মতো যদি এখনই উপেক্ষা করা হয় তবে তা দুর্দান্ত হবে be

পার্সার: কৌশল ইন্টারফেস যা পার্স পদ্ধতি প্রকাশ করে।

 public interface Parser<T> {
        public T parse(String inputFile);
    }

* জেনেরিক প্যারামিটার ব্যবহার করার কারণটি হ'ল যে কোনও রিটার্নের ধরণের অনুমতি দেওয়ার পাশাপাশি সংকলনের সময় ধরণের সুরক্ষা নিশ্চিত করা।

ProductDataXMLParser একটি product.xML ফাইল পার্স করার জন্য একটি কংক্রিট ক্লাস যাতে পণ্য সম্পর্কিত তথ্য থাকে। (এক্সএমএলবিয়ান ব্যবহার করে)

public class ProductDataXmlParser implements Parser<ProductDataTYPE> {

    public ProductDataTYPE parse(String inputFile) {
        ProductDataTYPE productDataDoc = null;
            File inputXMLFile = new File(inputFile);

        try {
            productDataDoc = ProductDataDocument.Factory.parse(inputXMLFile);
        } catch(XmlException e) {
            System.out.println("XmlException while parsing file : "+inputXMLFile);
        } catch(IOException e) { 
                 System.out.println("IOException while parsing file : "+inputXMLFile);
        }
        return productDataDoc.getProductData();
    }
} 

যেখানে : প্রোডাক্ট ডেটাটিওয়াইপি এবং প্রোডাক্টডাটা ডকুমেন্ট হ'ল এক্সএমএলবিয়ান পোজো ক্লাস একটি এক্সএসডি এবং স্কম্প কমান্ড ব্যবহার করে উত্পন্ন generated

ভবিষ্যৎ

ভবিষ্যতে যদি আমার কাছে product.txt ফাইলটি পার্স করা থাকে তবে আমি নিজের নিজস্ব প্রোডো ডেটা সংজ্ঞা দিতে পারি যা প্রোডাক্ট ডেটা বলে যা ফাইলের প্রয়োজনীয় বিষয়বস্তু ধরে রাখবে। এরপরে আমি প্রোডাক্টডাটাফ্ল্যাটফিলি পার্সার নামে একটি কংক্রিট ক্লাস তৈরি করতে পারি যা পার্সার ইন্টারফেসটি প্রয়োগ করে এবং পার্স পদ্ধতিটি ফাইল বিশ্লেষণের পরে আমার জন্য প্রোডাক্ট ডেটা পোজোকে জনপ্রিয় করে তোলে।

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


সফ্টওয়্যারটির মাধ্যমে ফোনকারীকে কোন ফাইল ফর্ম্যাটগুলি সমর্থন করে তা জানানো উচিত নয়? আপনার সফ্টওয়্যারটি কীভাবে জানতে পারে যে কোন পার্সারকে জিজ্ঞাসা করতে হবে?
tomdemuyt

আপনি আপনার নকশা সম্পর্কে প্রতিক্রিয়া খুঁজছেন , আপনার প্রকৃত বাস্তবায়ন নয় , তাই এটি প্রোগ্রামারগুলিতে যেখানে স্থানান্তরিত হবে সেখানে এটি স্থানান্তরিত হবে।
কোডস্পার্কল

@ টমডেমুয়েট চিন্তাভাবনা কারখানার প্যাটার্ন;)
সেকিং

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

2
দয়া করে ক্রসপোস্ট করবেন না। আপনি একটি গণ্ডগোল করছেন আমাদের পরিষ্কার করতে হবে।
ছিড়ে ফেলেছে

উত্তর:


7

আমার বেশ কয়েকটি উদ্বেগ রয়েছে:

  1. আমি নিশ্চিত করব যে একটি বাস্তবায়নের আগে আপনার জেনেরিক ডিজাইনের দরকার আছে। আপনি কি এক্সএমএল ব্যতীত অন্য ধরণের ফাইলের প্রয়োজনের বিষয়ে নিশ্চিত? যদি তা না হয় তবে তাদের জন্য কোড কেন? আপনার যদি শেষ পর্যন্ত এটির প্রয়োজন হয়, আপনি সেই সময়ে আপনার কোডটি পুনরায় তৈরি করতে পারেন। এটি বেশি সময় নেয় না, আপনার সম্ভবত অন্যান্য প্রয়োজনীয়তা থাকতে হবে যা কোড আপনি বর্তমানে যে প্রস্তাব করছেন তার চেয়ে আলাদা দেখায় এবং আপনার সম্ভবত এটি আর লেখার দরকার নেই। তারা যেমন বলেছে, ইয়াজিএনআই (আপনার দরকার পড়ার দরকার নেই)।
  2. আপনার যদি আসলে জেনেরিক ডিজাইনের প্রয়োজন হয় এবং আপনি এটি সম্পর্কে যথেষ্ট নিশ্চিত হন তবে আমি বলব যে Parser<T>এটি মূলত সাউন্ড। আমি দুটি সম্ভাব্য সমস্যা দেখতে পাচ্ছি: (1) এটি ফাইল ইনপুট ধরে নিয়েছে - উদাহরণস্বরূপ, আপনি যদি কোনও এইচটিটিপি প্রতিক্রিয়া থেকে উদ্ধার করে এমন কোনও জেএসওএন স্ট্রিম বিশ্লেষণের চেষ্টা করছেন? এবং (২) কিছু বড় জেনেরিক ফ্রেমওয়ার্কের অংশ ব্যতীত এটি অগত্যা খুব বেশি মান সরবরাহ করে না যেখানে আপনার কাছে প্রচুর বিভিন্ন ধরণের ডেটার জন্য বিভিন্ন ধরণের পার্সার রয়েছে। তবে আমি নিশ্চিত নই যে আপনার এত বড় জেনেরিক কাঠামোর দরকার আছে। আপনার ঠিক এখনই একটি খুব সাধারণ, কংক্রিট ব্যবহারের কেস রয়েছে, যতদূর আমি বলতে পারি: একটি এক্সএমএল ফাইলকে ProductDataএস এর তালিকায় পার্স করুন ।
  3. আপনি যেমন করছেন তেমন ব্যতিক্রমগুলি গিলে ফেলা প্রায় ভাল ধারণা নয় ProductDataXmlParser। আমি পরিবর্তে এটি কোনও ধরণের রূপান্তর করব RuntimeException

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

ঠিক আছে শান্ত হও. আমার ধারণা আমি পার্সার প্যারামিটারটিকে একটি স্ট্রিংয়ের পরিবর্তে একটি ইনপুট স্ট্রিম তৈরি করব, আমি যা বলছি তা। :) এবং ব্যতিক্রম সম্পর্কে শুনে ভাল - আমি নিশ্চিত না যে এটি আপনার প্রকৃত কোড বা স্ট্যাকওভারফ্লোয়ের জন্য কেবল নমুনা কোড থেকে আটকানো 'n' কেটে গেছে কিনা I

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

আপনি কী বলছেন তা আমি একটি চিন্তা করব। আমি এটি উল্লেখ করতে চাই যে এখানে 4 টি বিভিন্ন এক্সএমএল ফাইল রয়েছে যা 4 টি বিভিন্ন ধরণের ডেটা পার্স করতে পারে। প্রোডাক্ট ডেটা হ'ল এক প্রকারের ডেটা আমাদের সিস্টেম / পণ্য দ্বারা গ্রাস করতে হবে।
CKing

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

1

আপনার নকশা সেরা বিকল্প নয়। আপনার নকশা দ্বারা, এটি ব্যবহারের একমাত্র উপায়:

ProductDataXMLTYPE parser = new ProductDataXmlParser<ProductDataXMLTYPE>().parse(input); 
ProductDataTextTYPE parser = new ProductDataTextParser<ProductDataTextTYPE >().parse(input);

উপরের উদাহরণ থেকে আমরা খুব বেশি সুবিধা দেখতে পাচ্ছি না। আমরা এই জাতীয় জিনিসগুলি করতে পারি না:

Parser parser = getParser(string parserName);
parser.parse();

জেনেরিকের সন্ধানের আগে আপনি নিম্নলিখিত দুটি বিকল্প বিবেচনা করতে পারেন:

  • 1, পার্স করার পরে একই আউটপুট

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

public interface Parser {
    public ProductData parse(String inputFile);
}

এছাড়াও আপনি প্রোডাক্ট ডেটাটিকে আরও নমনীয় করতে চাইলে ইন্টারফেস হিসাবে সংজ্ঞায়িত করেন।

আপনি যদি না চান তবে পার্সারটি ডেটার সাথে মিশ্রিত হোক। আপনি এটিকে দুটি ইন্টারফেসে বিভক্ত করতে পারেন:

public interface Parser {
     public void parse(String inputFile);
}
public interface Data {
    public ProductData getData();
}

এবং আপনার পার্সারটি এর মতো দেখতে পাবেন:

public class XMLParser implements Parser, Data {} 
public class TextParser implements Parser, Data {}
  • 2, পার্স করার পরে বিভিন্ন আউটপুট

যদি প্রোডাক্টটাটা একই রকম না হয় এবং আপনি পার্সার ইন্টারফেসটি পুনরায় ব্যবহার করতে চান। আপনি এটি এইভাবে করতে পারেন:

public interface Parser {
   public void parse(String inputFile);
}

class XMLParse implements {
      @Override
      public void parse(String inputFile);

      ProductDataXML getProductData();        
}

class TextParse implements {
      @Override
      public void parse(String inputFile);

      ProductDataText getProductData();        
}

-2

আপনি যদি ইতিমধ্যে উপলব্ধ কিছু ব্যবহার করতে পছন্দ করব, আমি নামক একটি জাভা লাইব্রেরি তৈরি করেছি JRecordBind যে XMLSchema উপর ভিত্তি করে এর (JAXB সমর্থন)।

এটি নির্দিষ্ট দৈর্ঘ্যের ফাইলগুলি ব্যবহার / উত্পাদনের জন্য জন্মগ্রহণ করেছিল এবং XMLSchema যেহেতু তাদের গঠন নির্ধারণ করে, আপনি এটি সরল JAXB দিয়ে মার্শাল / আনমারশাল এক্সএমএল ফাইলগুলিতে ব্যবহার করতে পারেন


আমি জেনেরিক পার্সার বাস্তবায়নের জন্য একটি নকশা খুঁজছি! আমি মনে করি না আপনি সঠিকভাবে আমার প্রশ্ন uderstood :)।
Cking
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.