রানটাইমে ক্লাসে ক্ষেত্র যুক্ত করা - নকশার ধরণ


15

আপনার গ্রাহককে তাদের সিএমএসে ইশপে পণ্যটিতে নতুন সম্পত্তি (উদাহরণস্বরূপ রঙ) যুক্ত করার সম্ভাবনা থাকতে চান তা কল্পনা করুন।

ক্ষেত্র হিসাবে সম্পত্তি থাকার পরিবর্তে:

class Car extends Product {
   protected String type;
   protected int seats;
}

আপনি সম্ভবত কিছু করতে হবে:

class Product {
   protected String productName;
   protected Map<String, Property> properties;
}

class Property {
   protected String name;
   protected String value;
}

এটি, বিদ্যমান একের উপরে নিজস্ব টাইপ সিস্টেম তৈরি করা। এটি আমার কাছে মনে হয় যে এটি ডোমেন নির্দিষ্ট ল্যাঙ্গেজ তৈরির ক্ষেত্রে দেখা যেতে পারে, না পারে না?

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

সময় দেয়ার জন্য ধন্যবাদ :).



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

টনি: আমি এখানে জাভা ব্যবহার করছি, তবে এটি সিউডো কাউড বিবেচনা করুন :)। সি # কি আমাকে সেই ডায়নামিক অবজেক্টটিকে ডাটাবেসে চালিয়ে যাওয়ার অনুমতি দেবে? আমি সন্দেহ করি, কারণ ডাটাবেসের সামনে তথ্য কাঠামো জানা দরকার।
ফিলিপ করুন

নেই রাজ্য Desing প্যাটার্ন একটি লা গ্যাং অফ চার, যা একটি বস্তু তোলে প্রদর্শিত তার পরিবর্তন করতে টাইপ বা বর্গ রান সময়ে। অন্যান্য বিকল্প হ'ল পর্যবেক্ষক ডিজাইন প্যাটার্ন বা একটি প্রক্সি ডিজাইনের প্যাটার্ন
নিকোস এম

1
শুধু মানচিত্রের ডেটাটাইপ ব্যবহার করবেন না কেন? আপনি যদি পারফরম্যান্সের জন্য না জিজ্ঞাসা করেন তবে ডিবিতে এটি {আইডি} + {আইডি, কী, মান as হিসাবে উপস্থাপিত হতে পারে।
বৃষ্টির ছায়াগুলি

উত্তর:


4

অভিনন্দন! আপনি যেখান থেকে চলে গেছেন সেখান থেকে বিশ্বের অন্যদিকে পৌঁছে আপনি কেবল প্রোগ্রামিং ভাষা / টাইপ সিস্টেম গ্লোবকে অবরুদ্ধ করেছেন। আপনি সবেমাত্র গতিশীল ভাষা / প্রোটোটাইপ-ভিত্তিক অবজেক্ট জমির সীমানায় অবতরণ করেছেন!

অনেকগুলি গতিশীল ভাষা (যেমন জাভাস্ক্রিপ্ট, পিএইচপি, পাইথন) রানটাইমে কোনও ব্যক্তির বৈশিষ্ট্য প্রসারিত বা পরিবর্তন করতে দেয় or

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

পিএইচপি এবং পাইথনের মতো ল্যাঙ্গাউজগুলি মাঝের মাটিতে থাকে live তাদের নিয়মিত, প্রতিমা সংক্রান্ত ক্লাস-ভিত্তিক সিস্টেম রয়েছে systems তবে অবজেক্টের বৈশিষ্ট্যগুলি রানটাইমে যুক্ত করা, পরিবর্তন করা বা মুছতে পারে - কিছু সীমাবদ্ধতা থাকা সত্ত্বেও (যেমন "অন্তর্নির্মিত প্রকারগুলি বাদে") যা আপনি জাভাস্ক্রিপ্টে খুঁজে পান না।

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

আপনার ডিজাইনে ফিরে আসার পরে, আপনি আপনার ক্লাসের একটি উপসেটে গতিশীল বৈশিষ্ট্য রাখার ক্ষমতাটি কল্পনা করছেন। এ-এর Productভেরিয়েবল অ্যাট্রিবিউট থাকতে পারে; সম্ভবত একটি Invoiceবা একটি Orderহবে এবং না পারে। এটি কোনও খারাপ উপায় নয়। এটি আপনাকে কঠোর, শৃঙ্খলাবদ্ধ ভাষা এবং টাইপ সিস্টেমে থাকার সময় যেখানে প্রয়োজন সেখানে তারতম্য আনতে নমনীয়তা দেয়। নীচের দিকে, আপনি এই নমনীয় বৈশিষ্ট্যগুলি পরিচালনা করার জন্য দায়বদ্ধ এবং আপনাকে সম্ভবত এমন ব্যবস্থা ব্যবহার করতে হবে যা আরও স্থানীয় বৈশিষ্ট্য থেকে কিছুটা আলাদা দেখায়। p.prop('tensile_strength')বরং p.tensile_strength, উদাহরণস্বরূপ, এবং p.set_prop('tensile_strength', 104.4)বরংp.tensile_strength = 104.4। তবে আমি পাসকাল, আডা, সি, জাভা এবং এমনকী গতিশীল ভাষায় অনেকগুলি প্রোগ্রামের সাথে কাজ করেছি এবং তৈরি করেছি যা অ-মানক বৈশিষ্ট্য প্রকারের জন্য ঠিক এইরকম গেটর-সেটার অ্যাক্সেস ব্যবহার করেছিল; পদ্ধতির স্পষ্টভাবে কার্যক্ষম।

প্রসঙ্গত, স্থির ধরণের এবং একটি উচ্চ বৈচিত্রময় বিশ্বের মধ্যে এই উত্তেজনা অত্যন্ত সাধারণ। ডাটাবেস স্কিমা ডিজাইন করার সময় প্রায়শই একটি অভিন্ন সমস্যা দেখা যায়, বিশেষত সম্পর্কিত এবং প্রাক-সম্পর্কের আগে ডেটা স্টোরগুলির জন্য। কখনও কখনও এটি "সুপার-সারি" তৈরি করে এর সাথে মোকাবিলা করা হয় যা সমস্ত কল্পনাযুক্ত বৈচিত্রগুলির ইউনিয়নকে সংযোজন বা সংজ্ঞায়িত করার জন্য পর্যাপ্ত নমনীয়তা রাখে, তারপরে সেই ক্ষেত্রগুলিতে যে কোনও ডেটা আসে stuff ওয়ার্ডপ্রেস wp_postsটেবিল , উদাহরণস্বরূপ, মত ক্ষেত্র রয়েছে comment_count, ping_status, post_parentএবং post_date_gmtযে শুধুমাত্র কিছু পরিস্থিতিতে কার্যকর আকর্ষণীয়, এবং বাস্তবে প্রায়ই ফাঁকা হয়ে যেতে পারে। আরেকটি পদ্ধতির মতো অনেকটা অতিরিক্ত, সাধারণ টেবিলের মতো wp_options, আপনার মতোPropertyবর্গ। যদিও এর জন্য আরও সুস্পষ্ট ব্যবস্থাপনার প্রয়োজন, এতে থাকা আইটেমগুলি খুব কমই ফাঁকা থাকে। অবজেক্ট-ওরিয়েন্টেড এবং ডকুমেন্ট ডাটাবেসগুলির (যেমন: মঙ্গোডিবি) প্রায়শই পরিবর্তিত বিকল্পগুলির সাথে কাজ করার জন্য একটি সহজ সময় থাকে কারণ তারা ইচ্ছায় অনেকগুলি বৈশিষ্ট্য তৈরি করতে এবং সেট করতে পারে।


0

আমার প্রশ্নটি আমার দুটি সেন্ট:

আপনার দুটি পদ্ধতির মূলত পৃথক:

  • প্রথমটি হ'ল OO উত্তরগুলি দৃ strongly়ভাবে টাইপ করা হয়েছে - তবে এক্সটেনসিবল নয়
  • দ্বিতীয়টি দুর্বলভাবে টাইপ করা হয় (স্ট্রিং যেকোন কিছুকে আবদ্ধ করে)

সি ++ তে, অনেকে উভয়টির মিশ্রণ অর্জনের জন্য একটি স্ট্যান্ড :: বুস্টের মানচিত্র :: বৈকল্পিক ব্যবহার করবেন।

বিভেদ: নোট করুন যে কিছু ভাষা যেমন সি #, ধরণের গতিশীল তৈরির অনুমতি দেয়। যা গতিশীলভাবে সদস্যদের যুক্ত করার সাধারণ সমস্যার পক্ষে একটি দুর্দান্ত সমাধান হতে পারে। যাইহোক, সংকলনের পরে "সংশোধন / যুক্ত" প্রকারগুলি টাইপ সিস্টেমকে নিজেই দূষিত করে এবং আপনার "পরিবর্তিত" প্রকারগুলি প্রায় অকেজো করে তোলে (যেমন, আপনি কীভাবে এই জাতীয় যুক্ত বৈশিষ্ট্যগুলি অ্যাক্সেস করবেন, যেহেতু আপনি জানেন না যে এগুলি বিদ্যমান আছে? একমাত্র যুক্তিসঙ্গত উপায় হবে প্রতিটি বস্তুর উপর নিয়মতান্ত্রিক প্রতিচ্ছবি হয়ে উঠুন ... খাঁটি গতিশীল ভাষার সাথে সমাপ্তি _ আপনি 'ডায়নামিক' .NET কীওয়ার্ডটি উল্লেখ করতে পারেন)


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

0

রানটাইমে কোনও প্রকার তৈরি করা আরও জটিল মনে হয় তবে কেবল একটি বিমূর্ত স্তর তৈরি করে। ডিকুয়াল সিস্টেমগুলিতে বিমূর্ততা তৈরি করা খুব সাধারণ বিষয়।

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

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

আপনার উদাহরণে ফিরে আসা, কিছু যুক্তির সামনে একটি বিমূর্ত ভাষা তৈরি করা স্বাভাবিক। এটি "সম্পত্তি", "সারণী", "বার্তা", এমনকি মানব ভাষাও হতে পারে তবে এই পদ্ধতির ত্রুটিগুলিতে মনোযোগ দিন:

  • পার্সিং এবং বৈধকরণের জন্য আরও কোড (এবং আরও বেশি সময় কোর্স)। স্থির টাইপিংয়ের সাথে সংকলক আপনার জন্য যা কিছু করেছিল তা রান-টাইমে আপনাকে অবশ্যই করতে হবে।
  • বার্তা, টেবিল বা অন্যান্য আদিমতার আরও নথিপত্র document সমস্ত জটিলতা কোড থেকে কোনও ধরণের স্কিমা বা স্ট্যান্ডআর্টে যায়। এখানে উল্লিখিত আর্থিক জাহান্নামের স্কীমার উদাহরণ রয়েছে: http://ftp.moex.com/pub/FORTS/Plaza2/p2gate_en.pdf (কয়েক ডজন পৃষ্ঠাগুলি সারণী)

0

এই পদ্ধতিটি কি একটি পরিচিত নকশার ধরণ?

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

আপনি কি সমস্যাটিকে অন্যভাবে সমাধান করবেন?

হ্যাঁ, আমি এইভাবেই সমস্যার সমাধান করব।

আমি জানি এমন ভাষা আছে যেখানে আমি রানটাইমে একটি ক্ষেত্র যুক্ত করতে পারি, তবে ডাটাবেসের কী হবে?

একটি ডাটাবেস জাভা মত হবে, কিছু ইন্দ্রিয়। পেসুডো-স্কোলে:

TABLE products
(
    product_name VARCHAR(50),
    product_id INTEGER AUTOINCREMENT
)

TABLE attributes
(
    product_id INTEGER,
    name VARCHAR(50),
    value VARCHAR(2000)
)

এটি জাভার সাথে সঙ্গতিপূর্ণ হবে

class Product {
   protected String productName;
   protected Map<String, String> properties;
}

নোটটি কী হিসাবে নামটি সঞ্চয় করে রাখে তেমন কোনও সম্পত্তি শ্রেণীর প্রয়োজন নেই বলে মনে রাখবেন।

আপনি কি পরিবর্তে কলামগুলিকে যুক্ত / পরিবর্তন করতে পারবেন বা উপরে দেখানো মত কিছু ব্যবহার করতে চান?

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

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