অন্যান্য ব্যক্তিরা ইতিমধ্যে আমার প্রাথমিক ধারণা, ম্যাট্রিক্স পদ্ধতিটি পরামর্শ দিয়েছেন, তবে সরবরাহিত আর্গুমেন্টগুলি প্রত্যাশিত পরিসরে রয়েছে কিনা তা নিশ্চিত করে এবং স্থান-এর রিটার্নগুলি ব্যবহার করে কিছু নিশ্চিত করে আপনি যদি আপনার বিবৃতি কিছুটা এড়াতে পারেন তবে কিছু সংক্ষিপ্তকরণের পাশাপাশি স্ট্যান্ডার্ডগুলি আমি ফাংশনগুলির জন্য এক-পয়েন্ট-অফ-এক্সিটকে প্রয়োগ করতে দেখেছি, কিন্তু আমি পেয়েছি যে তীর কোডিং এড়ানোর জন্য একাধিক রিটার্ন খুব কার্যকর এবং জাভাতে ব্যতিক্রমগুলির প্রসার সহ যে কোনওভাবে এই জাতীয় নিয়ম কঠোরভাবে প্রয়োগ করার তেমন কোনও পয়েন্ট নেই I've যেহেতু পদ্ধতির ভিতরে ফেলে দেওয়া কোনও অপ্রয়োজনীয় ব্যতিক্রম যাইহোক প্রস্থানের সম্ভাব্য পয়েন্ট)। নেস্টিং স্যুইচ স্টেটমেন্টগুলি একটি সম্ভাবনা, তবে আপনি এখানে যাচাই করছেন এমন ছোট মানগুলির জন্য আমি খুঁজে পেয়েছি যে বিবৃতিগুলি আরও কমপ্যাক্ট হবে এবং ফলাফলের পারফরম্যান্সের পার্থক্যের খুব বেশি সম্ভাবনা নেই,
public int fightMath(int one, int two) {
if (one > 3 || one < 0 || two > 3 || two < 0) {
throw new IllegalArgumentException("Result is undefined for arguments outside the range [0, 3]");
}
if (one <= 1) {
if (two <= 1) return 0;
if (two - one == 2) return 1;
return 2; // two can only be 3 here, no need for an explicit conditional
}
// one >= 2
if (two >= 2) return 3;
if (two == 1) return 1;
return 2; // two can only be 0 here
}
এটি অন্যথায় ইনপুট-> ফলাফল ম্যাপিংয়ের অংশগুলির অনিয়মের কারণে হতে পারে এর চেয়ে কম পাঠযোগ্য হতে পারে up আমি ম্যাট্রিক্স শৈলীর পরিবর্তে এর সরলতার কারণে এবং কীভাবে আপনি ম্যাট্রিক্সটি দৃষ্টিভঙ্গি করে তুলতে পারেন (যদিও এটি কর্নো ম্যাপের আমার স্মৃতি দ্বারা প্রভাবিত):
int[][] results = {{0, 0, 1, 2},
{0, 0, 2, 1},
{2, 1, 3, 3},
{2, 1, 3, 3}};
আপডেট: আপনার ব্লকিং / হিট করার কথা উল্লেখ করে এখানে ফাংশনে আরও আমূল পরিবর্তন আনা হয়েছে যা ইনপুট এবং ফলাফলের জন্য যথাযথ / অ্যাট্রিবিউট হোল্ডিং এনুমুরেটেড প্রকারগুলি ব্যবহার করে এবং ফলাফলকে ব্লক করার জন্য অ্যাকাউন্টকে কিছুটা সংশোধন করে, যার ফলস্বরূপ আরও বেশি হওয়া উচিত পাঠযোগ্য ফাংশন
enum MoveType {
ATTACK,
BLOCK;
}
enum MoveHeight {
HIGH,
LOW;
}
enum Move {
// Enum members can have properties/attributes/data members of their own
ATTACK_HIGH(MoveType.ATTACK, MoveHeight.HIGH),
ATTACK_LOW(MoveType.ATTACK, MoveHeight.LOW),
BLOCK_HIGH(MoveType.BLOCK, MoveHeight.HIGH),
BLOCK_LOW(MoveType.BLOCK, MoveHeight.LOW);
public final MoveType type;
public final MoveHeight height;
private Move(MoveType type, MoveHeight height) {
this.type = type;
this.height = height;
}
/** Makes the attack checks later on simpler. */
public boolean isAttack() {
return this.type == MoveType.ATTACK;
}
}
enum LandedHit {
NEITHER,
PLAYER_ONE,
PLAYER_TWO,
BOTH;
}
LandedHit fightMath(Move one, Move two) {
// One is an attack, the other is a block
if (one.type != two.type) {
// attack at some height gets blocked by block at same height
if (one.height == two.height) return LandedHit.NEITHER;
// Either player 1 attacked or player 2 attacked; whoever did
// lands a hit
if (one.isAttack()) return LandedHit.PLAYER_ONE;
return LandedHit.PLAYER_TWO;
}
// both attack
if (one.isAttack()) return LandedHit.BOTH;
// both block
return LandedHit.NEITHER;
}
এমনকি যদি আপনি আরও উচ্চতার ব্লক / আক্রমণ যোগ করতে চান তবে আপনাকে নিজেই ফাংশনটি পরিবর্তন করতে হবে না; অতিরিক্ত ধরণের পদক্ষেপ যুক্ত করার জন্য সম্ভবত ফাংশনটির পরিবর্তন প্রয়োজন হবে require এছাড়াও মূল এনামের বৈশিষ্ট্য হিসাবে অতিরিক্ত এনামগুলি ব্যবহার করার চেয়ে EnumSet
এস আরও বর্ধনযোগ্য হতে পারে, উদাহরণস্বরূপ EnumSet<Move> attacks = EnumSet.of(Move.ATTACK_HIGH, Move.ATTACK_LOW, ...);
এবং তার attacks.contains(move)
চেয়ে বরং এস এর move.type == MoveType.ATTACK
ব্যবহার EnumSet
সম্ভবত সরাসরি সমান পরীক্ষার তুলনায় কিছুটা ধীর হতে হবে।
কেস যেখানে একটি সফল ব্লক একটি পাল্টা ফলাফল স্বরূপ, আপনি প্রতিস্থাপন করতে পারেন if (one.height == two.height) return LandedHit.NEITHER;
সঙ্গে
if (one.height == two.height) {
// Successful block results in a counter against the attacker
if (one.isAttack()) return LandedHit.PLAYER_TWO;
return LandedHit.PLAYER_ONE;
}
এছাড়াও, if
টেরিনারি অপারেটর ( boolean_expression ? result_if_true : result_if_false
) এর ব্যবহারের সাথে কিছু বিবৃতি প্রতিস্থাপনের ফলে কোডটি আরও কমপ্যাক্ট হয়ে উঠতে পারে (উদাহরণস্বরূপ, পূর্ববর্তী ব্লকের কোডটি হয়ে উঠত return one.isAttack() ? LandedHit.PLAYER_TWO : LandedHit.PLAYER_ONE;
), তবে এটি কঠোরভাবে পঠনযোগ্য oneliners হতে পারে তাই আমি চাইতাম না ' টি আরও জটিল শাখার জন্য এটি প্রস্তাব।