যৌগিক প্যাটার্ন বা গাছের কাঠামো, বা তৃতীয় বাস্তবায়ন কীভাবে আপনি বলতে পারেন?


14

আমার দুটি ক্লায়েন্টের ধরণ রয়েছে, একটি " পর্যবেক্ষক " -প্রকার এবং একটি " বিষয় " -প্রকার। তারা উভয়ই গ্রুপের শ্রেণিবিন্যাসের সাথে যুক্ত ।

পর্যবেক্ষক বিভিন্ন শ্রেণিবিন্যাসের সাথে সম্পর্কিত গ্রুপগুলির কাছ থেকে (ক্যালেন্ডার) ডেটা পাবেন । এই ডেটাটি গোষ্ঠীর 'প্যারেন্ট' গ্রুপের ডেটা একত্রিত করে ডেটা সংগ্রহ করার চেষ্টা করে গণনা করা হয় (প্রতিটি গ্রুপে কেবল একটি পিতা বা মাতা থাকতে পারে )।

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

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

সুতরাং আমি মনে করি এটির সংক্ষিপ্ত বিবরণ পাওয়া যায় যে আমার উপরে এমন নিম্নক্রম হতে সক্ষম হওয়া দরকার যা আপনি উপরে এবং নীচে যেতে পারেন এবং কিছু জায়গাগুলি তাদের পুরো হিসাবে বিবেচনা করতে সক্ষম হবে (পুনরাবৃত্তি, মূলত)।

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

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

সম্পাদনা :

আমার নকশাটি এখানে রয়েছে: পদ্ধতি সহ শ্রেণীর চিত্রটি অন্তর্ভুক্ত।  "গ্রুপ" শ্রেণি হায়ারার্কি

"ফিনিক্স" -ক্লাসটির নামকরণ করা হয়েছে কারণ আমি এখনও কোনও উপযুক্ত নামটি ভাবি নি।

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


সামান্য অফ-বিষয় :

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


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

আপনার প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ. এখানে গ্রুপগুলির একাধিক শ্রেণিবদ্ধতা রয়েছে যা পর্যবেক্ষকদের মাধ্যমে বাদে একে অপরের সাথে সংযুক্ত নয়, তবে আমি মনে করি না যে তারা গ্রাফ অবজেক্টগুলির একটি অংশ, তাদের কেবল একটি সূক্ষ্ম বিন্যাস রয়েছে। শ্রেণিবদ্ধ প্রতিটি গ্রুপের মধ্যে কেবল 1 জন প্যারেন্ট থাকতে পারে তবে 0 .. * বাচ্চা থাকতে পারে। কীভাবে আপনি এটি কোনও গ্রাফে প্রয়োগ করবেন? এবং 1 গোষ্ঠীর সাথে কেবল একটি শ্রেণিবিন্যাসের 0 ডিগ্রি থাকবে 0-2-গ্রুপ-স্তরক্রম এবং বৃহত্তর তাদের সবার কমপক্ষে 1 এবং সম-আউট ডিগ্রি থাকবে I'll আমি এটি সম্পর্কিত পদ্ধতিগুলি তালিকাতে চেষ্টা করব এক ঘন্টা, যখন আমি কর্মক্ষেত্রে আছি

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

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

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

উত্তর:


1

এখানে একটি সাধারণ "গোষ্ঠী" বাস্তবায়ন যা আপনাকে রুটে নেভিগেট করতে এবং সেই রুটের গাছটিকে সংগ্রহ হিসাবে নেভিগেট করতে দেয়।

public class Group
{
  public Group Parent
  public List<Group> Children

  public IEnumerable<Group> Parents()
  {
    Group result = this;
    while (result.Parent != null)
    {
      result = result.Parent;
      yield return result;
    }
  }
  public Group Root()
  {
    return Parents.LastOrDefault() ?? this;
  }


  public IEnumerable<Group> WalkTreeBreadthFirst(
  {
    //http://en.wikipedia.org/wiki/Breadth-first_search
    HashSet<Group> seenIt = new HashSet<Group>()
    Queue<Group> toVisit = new Queue<Group>();
    toVisit.Enqueue(this);

    while (toVisit.Any())
    {
      Group item = toVisit.Dequeue();
      if (!seenIt.Contains(item))
      {
        seenIt.Add(item);
        foreach (Group child in item.Children)
        {
          toVisit.Enqueue(child);
        }
        yield return item;
      }
    }
  }

  public static IEnumerable<Group> WalkTreeDepthFirst()
  {
    // http://en.wikipedia.org/wiki/Depth-first_search
    HashSet<Group> seenIt = new HashSet<Group>();
    Stack<Group> toVisit = new Stack<Group>();

    toVisit.Push(this);

    while (toVisit.Any())
    {
      Group item = toVisit.Pop();
      if (!seenIt.Contains(item))
      {
        seenIt.Add(item);
        foreach (Group child in item.Children.Reverse())
        {
          toVisit.Push(child);
        }
        yield return item;
      }
    }
  }
}

সুতরাং - একটি গোষ্ঠী দেওয়া হয়েছে, আপনি সেই গোষ্ঠীর গাছটি হাঁটতে পারেন:

Group myGroup = GetGroup();
Group root = myGroup.Root;
foreach(Group inTree in root.WalkTreeBreadthFirst())
{
  //do something with inTree Group.
}

এটি পোস্ট করার ক্ষেত্রে আমার আশা, কোনও গাছ কীভাবে নেভিগেট করা যায় (এবং এর জটিলতা দূর করে) দেখিয়ে আপনি গাছটিতে যে কাজগুলি করতে চান তার সম্পর্কে কল্পনা করতে সক্ষম হতে পারেন, এবং তারপরে আপনার নিজের মতো করে নিদর্শনগুলি আবার দেখতে পাবেন কি সেরা প্রযোজ্য।


0

আপনার সিস্টেমের ব্যবহার বা প্রয়োগের প্রয়োজনীয়তার আমাদের সীমিত দৃশ্যের সাথে খুব নির্দিষ্ট হওয়া খুব কঠিন। উদাহরণস্বরূপ, যে বিষয়গুলি বিবেচনায় আসবে সেগুলি হ'ল:

  • সিস্টেমটি কি অত্যন্ত সমকালীন (প্রচুর ব্যবহারকারী)?
  • ডেটা অ্যাক্সেসের পাঠ / লেখার অনুপাত কী? (উচ্চ পঠিত, কম লেখাই সাধারণ)

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

আপনার চিত্রটি আমার কাছে সাধারণত ঠিক আছে।

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

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

আপনার সিস্টেমে এটি কতটা উপযুক্ত তা আমার কোনও ধারণা নেই তবে এটি বিবেচনার জন্য উপযুক্ত।

এছাড়াও, এসও সম্পর্কিত এই প্রশ্নটি প্রাসঙ্গিক হতে পারে:

/programming/1567935/how-to-do-inheritance-modeling-in-relational-databases


0

আমি জানি এটি প্রকারের ধরণের, তবে আমি এটি যাইহোক বলতে চাইছি, আমি মনে করি আপনি Observer Pattern যে পর্যবেক্ষণের ধরণটি পেয়েছেন এবং যা আপনার কাছে আমার কাছে পর্যবেক্ষক প্যাটার্নের মতো দেখাচ্ছে তা আপনার একবার দেখে নেওয়া উচিত ।

দু'টি লিঙ্ক:

DoFactory

oodesign

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

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