এলএসপি লঙ্ঘন করা কি কখনও ঠিক আছে?


10

আমি এই প্রশ্ন অনুসরণ করছি , কিন্তু আমি কোড থেকে আমার নীতি একটি নীতি পরিবর্তন করছি।

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

এখন, আমার সমস্যাটি এইভাবে সংক্ষিপ্ত করা যেতে পারে: আমার একটি বিমূর্ততা Weapon classএবং দুটি শ্রেণি রয়েছে Swordএবং Reloadable। যদি Reloadableএকটি নির্দিষ্ট method, নামক থাকে Reload()তবে এটি অ্যাক্সেস করার জন্য আমাকে ডাউনকাস্ট করতে হবে methodএবং আদর্শভাবে আপনি এটি এড়াতে চান want

আমি তখন ব্যবহার করার কথা ভেবেছিলাম Strategy Pattern। এইভাবে প্রতিটি অস্ত্র কেবল এটি সম্পাদন করতে সক্ষম সেগুলি সম্পর্কে সচেতন ছিল, সুতরাং উদাহরণস্বরূপ, একটি Reloadableঅস্ত্র স্পষ্টতই পুনরায় লোড করতে পারে, তবে একটি Swordকরতে পারে না এবং এমনকি একটি সম্পর্কে অবগতও নয় Reload class/method। আমি আমার স্ট্যাক ওভারফ্লো পোস্টে যেমন বলেছি, আমাকে হ্রাস করতে হবে না এবং আমি কোনও List<Weapon>সংগ্রহ বজায় রাখতে পারি ।

উপর আরেকটি ফোরাম , প্রথম উত্তর করার জন্য পরামর্শ দেওয়া Swordসচেতন হতে হবে Reloadশুধু কিছু করবেন না। উপরে উল্লিখিত স্ট্যাক ওভারফ্লো পৃষ্ঠায় এই একই উত্তর দেওয়া হয়েছিল।

আমি কেন পুরোপুরি বুঝতে পারি না। নীতিটি লঙ্ঘন করে তরোয়ালকে সচেতন হওয়ার Reloadএবং এটিকে ফাঁকা রাখার অনুমতি দেয় কেন ? আমি আমার স্ট্যাক ওভারফ্লো পোস্টে যেমন বলেছিলাম, এসপি আমার সমস্যাগুলি বেশিরভাগ সমাধান করেছে।

কেন এটি একটি কার্যকর সমাধান নয়?

public final Weapon{

    private final String name;
    private final int damage;
    private final List<AttackStrategy> validactions;
    private final List<Actions> standardActions;

    private Weapon(String name, int damage, List<AttackStrategy> standardActions, List<Actions> attacks)
    {
        this.name = name;
        this.damage = damage;
        standardActions = new ArrayList<Actions>(standardActions);
        validAttacks = new ArrayList<AttackStrategy>(validActions);
    }

    public void standardAction(String action){} // -- Can call reload or aim here.  

    public int attack(String action){} // - Call any actions that are attacks. 

    public static Weapon Sword(String name, damage, List<AttackStrategy> standardActions, List<Actions> attacks){
        return new Weapon(name, damage,standardActions, attacks) ;
    }

}

আক্রমণ ইন্টারফেস এবং বাস্তবায়ন:

public interface AttackStrategy{
    void attack(Enemy enemy);
}

public class Shoot implements AttackStrategy {
    public void attack(Enemy enemy){
        //code to shoot
    }
}

public class Strike implements AttackStrategy {
    public void attack(Enemy enemy){
        //code to strike
    }
}

2
আপনি করতে পারেন class Weapon { bool supportsReload(); void reload(); }। পুনরায় লোড করার আগে ক্লায়েন্টরা সমর্থন করলে তা পরীক্ষা করে দেখবে। reloadiff নিক্ষেপ করার জন্য চুক্তিবদ্ধভাবে সংজ্ঞায়িত করা হয় !supportsReload()। এটি এলএসপি-র অনুসরণ করে যদি ড্রাইভ করা ক্লাসগুলি আমি ঠিকই উল্লিখিত প্রোটোকলের সাথে মেনে চলে।
usr ডিরেক্টরির

3
আপনি reload()ফাঁকা ছেড়ে যান বা standardActionsপুনরায় লোড অ্যাকশন না থাকা কেবল একটি আলাদা প্রক্রিয়া। কোন মৌলিক পার্থক্য নেই। আপনি উভয় করতে পারেন। => আপনার সমাধান হয় টেকসই (যা আপনার প্রশ্ন ছিল না) .; অস্ত্রগুলিতে একটি ফাঁকা ডিফল্ট বাস্তবায়ন থাকলে তরোয়ালটি পুনরায় লোড সম্পর্কে জানতে হবে না।
usr ডিরেক্টরির

27
আমি এই সমস্যাটি সমাধানের জন্য বিভিন্ন কৌশল নিয়ে বিভিন্ন সমস্যা অনুসন্ধান করে একটি ধারাবাহিক নিবন্ধ লিখেছি। উপসংহার: ভাষার টাইপ সিস্টেমে আপনার গেমের নিয়ম ক্যাপচার চেষ্টা করবেন না । গেমের নিয়মগুলি অবজেক্টগুলিতে ক্যাপচার করুন যা প্রকার সিস্টেমের স্তরের নয়, গেম যুক্তির স্তরে নিয়মকে প্রতিনিধিত্ব করে এবং প্রয়োগ করে । বিশ্বাস করার কোনও কারণ নেই যে আপনি যে ধরনের টাইপ সিস্টেম ব্যবহার করছেন তা আপনার গেমের যুক্তি উপস্থাপনের জন্য যথেষ্ট পরিশীলিত। ericlippert.com/2015/04/27/wizards-and-warriors-part-one
এরিক লিপার্ট

2
@ এরিকলিপার্ট - আপনার লিঙ্কের জন্য ধন্যবাদ। আমি এই ব্লগটি বহুবার এসেছি, তবে কয়েকটি পয়েন্ট আমি বেশ বুঝতে পারি নি তবে এটি আপনার দোষ নয়। আমি নিজে থেকে ওওপি শিখছি এবং সলড প্রিন্সিপালগুলি জুড়ে এসেছি। আমি যখন প্রথমবার আপনার ব্লগটি দেখতে পেলাম তখন তা আমি মোটেও বুঝতে পারি নি তবে আমি আরও কিছুটা শিখলাম এবং আবার আপনার ব্লগটি পড়লাম এবং আস্তে আস্তে যা বলা হচ্ছে তার কিছু অংশ বুঝতে শুরু করেছিলাম। একদিন, আমি সেই সিরিজের সমস্ত কিছুই পুরোপুরি বুঝতে পারব। আমি আশা করি: ডি

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

উত্তর:


16

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

  • উত্তরাধিকার একটি বেস শ্রেণীর প্রয়োগের উত্তরাধিকারী হিসাবে ব্যবহৃত হয়, তবে এর ইন্টারফেস নয়। প্রায় সব ক্ষেত্রে রচনা পছন্দ করা উচিত। জাভা এর মতো ভাষা প্রয়োগ এবং ইন্টারফেসের উত্তরাধিকার পৃথক করতে পারে না, তবে সি সি ++ এর privateউত্তরাধিকার রয়েছে।

  • উত্তরাধিকার একটি সমষ্টি প্রকার / ইউনিয়ন, যেমন মডেল ব্যবহৃত: একটি Baseপারেন হয় CaseAবা CaseB। বেস প্রকারটি কোনও প্রাসঙ্গিক ইন্টারফেস ঘোষণা করে না। এর দৃষ্টান্তগুলি ব্যবহার করতে, আপনাকে অবশ্যই এটি সঠিক কংক্রিটের ধরণের করতে হবে। Ingালাই নিরাপদে করা যেতে পারে এবং এটি সমস্যা নয়। দুর্ভাগ্যক্রমে, অনেক ওওপি ভাষা কেবল শ্রেণীবদ্ধ সাব টাইপগুলিকে কেবলমাত্র উদ্দিষ্ট সাব টাইপগুলিতে সীমাবদ্ধ করতে সক্ষম হয় না। যদি বাহ্যিক কোড একটি তৈরি করতে পারে CaseC, তবে কোড ধরেই ধরে নেওয়া হয় যে Baseকেবলমাত্র একটি হতে পারে CaseAবা CaseBভুল। স্ক্যালাল এটির case classধারণাটি সহ নিরাপদে এটি করতে পারে । জাভাতে, এটি মডেল করা যেতে পারে যখন Baseএকটি বেসরকারী নির্মাণকারী সহ একটি বিমূর্ত শ্রেণি হয়, এবং নীস্টযুক্ত স্ট্যাটিক ক্লাসগুলি বেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

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

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

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

শ্রেণিবদ্ধতা তৈরি করা প্রয়োজন হয় না। দুটি ধরণের Gunএবং Swordসম্পূর্ণ সম্পর্কহীন হতে পারে। একটি যেখানে Gunকরতে পারেন fire()এবং reload()একটি Swordশুধুমাত্র may strike()। যদি আপনাকে এই বস্তুগুলি বহুরূপে পরিচালনা করতে হয় তবে আপনি অ্যাডাপ্টার প্যাটার্নটি প্রাসঙ্গিক দিকগুলি ক্যাপচার করতে পারেন। জাভা 8-এ কার্যকরী ইন্টারফেস এবং ল্যাম্বডাস / পদ্ধতি রেফারেন্সের সাথে সুবিধার পরিবর্তে এটি সম্ভব। যেমন আপনার একটি Attackকৌশল থাকতে পারে যার জন্য আপনি সরবরাহ করেন myGun::fireবা সরবরাহ করেন () -> mySword.strike()

অবশেষে, কখনও কখনও কোনও সাবক্লাস এড়ানো কখনও কখনও বুদ্ধিমান হয় তবে একক প্রকারের মাধ্যমে সমস্ত বস্তুকে মডেল করে। এটি গেমগুলিতে বিশেষত প্রাসঙ্গিক কারণ অনেক গেমের অবজেক্টগুলি কোনও শ্রেণিবিন্যাসের সাথে পুরোপুরি ফিট করে না এবং এর বিভিন্ন ক্ষমতাও থাকতে পারে। উদাহরণস্বরূপ, একটি ভূমিকা বাজানো গেমের এমন একটি আইটেম থাকতে পারে যা উভয়ই অনুসন্ধানের আইটেম, আপনার পরিসংখ্যানগুলিকে সজ্জিত করার সময় +2 শক্তিযুক্ত করে তোলে, প্রাপ্ত কোনও ক্ষতি উপেক্ষা করার 20% সম্ভাবনা থাকে এবং একটি melee আক্রমণ সরবরাহ করে। বা সম্ভবত পুনরায় লোডযোগ্য তরোয়াল কারণ এটি * যাদু *। গল্পটি কী প্রয়োজন তা কে জানে।

এই জগাখিচির জন্য শ্রেণি শ্রেণিবিন্যাস বের করার চেষ্টা করার পরিবর্তে, এমন একটি ক্লাস থাকা ভাল যা বিভিন্ন ক্ষমতার জন্য স্লট সরবরাহ করে। এই সময় স্লট রানটাইম পরিবর্তন করা যেতে পারে। প্রতিটি স্লট কৌশল বা কলব্যাকের মতো OnDamageReceivedবা হবে Attack। আপনার অস্ত্র সঙ্গে, আমরা থাকতে পারে MeleeAttack, RangedAttackএবং Reloadস্লট। এই স্লটগুলি খালি থাকতে পারে, সেই ক্ষেত্রে বস্তুটি এই ক্ষমতাটি সরবরাহ করে না। স্লট তারপর শর্তসাপেক্ষে বলা হয়: if (item.attack != null) item.attack.perform()


একরকমভাবে এসপির মতো বাছাই করুন। স্লটটি খালি রাখতে হবে কেন? যদি

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

আমি সম্মত হই যে বাস্তব বিশ্বের বস্তুগুলি মডেলটি ভাল করে না। আমি যদি আপনার পোস্ট বুঝতে পারি, আপনার বক্তব্য আমি কৌশল প্যাটার্নটি ব্যবহার করতে পারি?

2
@ এসআর হ্যাঁ, কোনও রূপে কৌশল প্যাটার্নটি সম্ভবত একটি বুদ্ধিমান পন্থা। সম্পর্কিত ধরণের অবজেক্ট প্যাটার্নের সাথেও তুলনা করুন: গেমপ্রগ্রামিংপ্যাটার্নস.com
amon

3

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

যা যা বলেছিল, আমি আপনার অন্যান্য প্রশ্নের উত্তরগুলির সাথে বিশেষভাবে একমত নই। রয়ে swordথেকে উত্তরাধিকারী weaponভয়ঙ্কর, সরল OO যেমন পণ্য যা সর্বদাই নো অপ পদ্ধতি বা টাইপ-চেক করতে বিশালাকার কোড সম্পর্কে আকীর্ণ হয়।

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


আমি মনে করি এটি নিখুঁত। আমি এসপি ব্যবহার করতে পারি, তবে তারা ট্রেড অফস, কেবল তাদের সম্পর্কে সচেতন হতে হবে। আমার মনে আছে কি জন্য আমার সম্পাদনা দেখুন।

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

গন্তব্য 2 তরোয়াল মধ্যে Fww কিছু কারণে গোলাবারুদ ব্যবহার!

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

1
আমি এটি নিয়ে CAD97 এর সাথে আছি। এবং এমন একটি তৈরি করবে WeaponBuilderযা কৌশলগুলির একটি অস্ত্র রচনা করে তরোয়াল এবং বন্দুক তৈরি করতে পারে।
ক্রিস ওহলার্ট 13

3

অবশ্যই এটি একটি কার্যকর সমাধান; এটি একটি খুব খারাপ ধারণা।

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

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

if (isEquipped(weapon)) {
   reload();
}

এখন যদি এটি প্রয়োগ না করা ব্যতিক্রম ছুঁড়ে ফেলে এবং আপনার প্রোগ্রামটিকে ক্র্যাশ করে তোলে তবে এটি খুব খারাপ ধারণা।

যদি আপনার কোডটি এর মতো দেখায়,

if (canReload(weapon)) {
   reload();
}
else if (canSharpen(weapon)) {
  sharpen();
}
else if (canPollish(weapon)) {
  polish();
}

তারপরে আপনার কোডটি খুব সুনির্দিষ্ট বৈশিষ্ট্য নিয়ে বিশৃঙ্খল হয়ে উঠতে পারে যার বিমূর্ত 'অস্ত্র' ধারণাটির সাথে কোনও সম্পর্ক নেই।

তবে যদি আপনি প্রথম ব্যক্তি শ্যুটার বাস্তবায়ন করেন এবং আপনার সমস্ত অস্ত্র গুলি ছোঁড়া / পুনরায় লোড করতে পারে তবে সেই ছুরিটি পরে (আপনার নির্দিষ্ট প্রসঙ্গে) আপনার ছুরিটির পুনরায় লোড কিছু না করায় এটি খুব বোঝা যায় যেহেতু ব্যতিক্রম এবং প্রতিকূলতা রয়েছে নির্দিষ্ট বৈশিষ্ট্যগুলির সাথে আপনার বেস ক্লাস বিশৃঙ্খল থাকার কম।

আপডেট: বিমূর্ত মামলা / পদ সম্পর্কে চিন্তা করার চেষ্টা করবেন না। উদাহরণস্বরূপ, হতে পারে প্রতিটি অস্ত্রের একটি "প্রস্তুত" ক্রিয়া থাকে যা বন্দুকের জন্য পুনরায় লোড এবং তরোয়ালগুলির জন্য একটি অচিরেই থাকে।


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

উপরে সম্পাদনা দেখুন। এসপি

0

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

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


0

এলএসপিটি ভাল কারণ এটি কলিং কোডটিকে ক্লাস কীভাবে কাজ করে তা নিয়ে চিন্তা করতে না পারে।

যেমন। আমার ব্যাটেলমেচে লাগানো সমস্ত অস্ত্রগুলিতে আমি ওয়েপনকে কল করতে পারি tt

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

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

বিকল্পভাবে আপনি নিজের আর্কিটেকচারটি পুনর্নির্মাণ করতে পারেন এবং বিবেচনা করতে পারেন যে বিমূর্তে সমস্ত অস্ত্র পুনরায় লোডযোগ্য এবং কিছু অস্ত্র কেবল পুনরায় লোড করার প্রয়োজন হয় না।

তারপরে আপনি আর বন্দুকের জন্য ক্লাস বাড়িয়ে দিচ্ছেন না, বা এলএসপি লঙ্ঘন করছেন না।

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

সম্পাদনা করুন: কৌশল প্যাটার্নটি খারাপ কেন (টিএম)

এটি নয়, তবে সেটআপ, কার্য সম্পাদন এবং সামগ্রিক কোড বিবেচনা করুন।

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

আমি যখন কোনও পদ্ধতিতে কল করি তখন আমাকে সেই ক্রিয়া তালিকার মধ্য দিয়ে লুপ করতে হবে এবং কোন কল করতে হবে তা দেখতে একটি স্ট্রিং ম্যাচ করতে হবে।

আমি যখন কোডটি সংকলন করি এবং ওয়েপনকে কল করি। "আক্রমণ" এর পরিবর্তে ডোন ("atack") আমি সংকলনের ক্ষেত্রে ত্রুটি পাই না।

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


আমি মনে করি এসপি সমস্ত কিছু পরিচালনা করতে পারে (উপরে সম্পাদনা দেখুন), বন্দুকটি থাকতে পারে SafteyOn()এবং Swordথাকবে wipeOffBlood()। প্রতিটি অস্ত্র অন্যান্য পদ্ধতি সম্পর্কে অবগত নয় (এবং সেগুলি হওয়া উচিত নয়)

এসপি ঠিক আছে, তবে এটি টাইপ সুরক্ষা ছাড়াই ডাউনকাস্টিংয়ের সমতুল্য। আমি অনুমান করি যে আমি একটি ভিন্ন প্রশ্নের উত্তর দিচ্ছিলাম, আমাকে আপডেট করতে দিন
ইওয়ান

2
নিজে কৌশলগত প্যাটার্ন কোনও তালিকা বা অভিধানে কোনও কৌশলটির গতিশীল অনুসন্ধানকে বোঝায় না। উভয় weapon.do("attack")এবং টাইপ-সেফ weapon.attack.perform()কৌশল কৌশলটির উদাহরণ হতে পারে। কোনও কনফিগার ফাইল থেকে অবজেক্টটি কনফিগার করার সময় নাম অনুসারে কৌশলগুলি সন্ধান করা প্রয়োজনীয়, যদিও প্রতিবিম্বটি ব্যবহার করা সমানভাবে টাইপ-সেফ হবে।
আমন

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