আমি কিছু কোড রিফ্যাক্টর করার কাজ করছি, এবং আমি মনে করি আমি খরগোশের গর্ত থেকে প্রথম পদক্ষেপ নিয়েছি। আমি জাভাতে উদাহরণ লিখছি, তবে আমি অনুমান করি এটি অজ্ঞেয়বাদী হতে পারে।
আমি একটি ইন্টারফেস Foo
হিসাবে হিসাবে সংজ্ঞায়িত করা আছে
public interface Foo {
int getX();
int getY();
int getZ();
}
এবং একটি বাস্তবায়ন হিসাবে
public final class DefaultFoo implements Foo {
public DefaultFoo(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getZ() {
return z;
}
private final int x;
private final int y;
private final int z;
}
আমার কাছে একটি ইন্টারফেস রয়েছে MutableFoo
যা মিলে মিউটরদের সরবরাহ করে
/**
* This class extends Foo, because a 'write-only' instance should not
* be possible and a bit counter-intuitive.
*/
public interface MutableFoo extends Foo {
void setX(int newX);
void setY(int newY);
void setZ(int newZ);
}
এটির বেশ কয়েকটি বাস্তবায়ন MutableFoo
বিদ্যমান থাকতে পারে (আমি এখনও এগুলি প্রয়োগ করি নি)। তার মধ্যে একটি
public final class DefaultMutableFoo implements MutableFoo {
/**
* A DefaultMutableFoo is not conceptually constructed
* without all values being set.
*/
public DefaultMutableFoo(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int getX() {
return x;
}
public void setX(int newX) {
this.x = newX;
}
public int getY() {
return y;
}
public void setY(int newY) {
this.y = newY;
}
public int getZ() {
return z;
}
public void setZ(int newZ) {
this.z = newZ;
}
private int x;
private int y;
private int z;
}
আমি এগুলিকে বিভক্ত করার কারণ এটি প্রতিটি ব্যবহারের জন্য সমান সম্ভাবনা। অর্থ, এটিও সমান সম্ভাবনা রয়েছে যে এই শ্রেণিগুলি ব্যবহার করে কেউ একটি পরিবর্তনীয় উদাহরণ চাইবে, কারণ তারা হ'ল একটি পরিবর্তনীয় চাই।
আমার কাছে থাকা প্রাথমিক ব্যবহারের StatSet
কেসটি একটি ইন্টারফেস বলে যা কোনও গেমের জন্য নির্দিষ্ট যুদ্ধের বিবরণ উপস্থাপন করে (হিটপয়েন্টস, আক্রমণ, প্রতিরক্ষা)। তবে, "কার্যকর" পরিসংখ্যান বা প্রকৃত পরিসংখ্যানগুলি বেস পরিসংখ্যানগুলির ফলাফল, যা কখনই পরিবর্তন করা যায় না এবং প্রশিক্ষিত পরিসংখ্যান, যা বাড়ানো যায়। এই দুটি দ্বারা সম্পর্কিত
/**
* The EffectiveStats can never be modified independently of either the baseStats
* or trained stats. As such, this StatSet must never provide mutators.
*/
public StatSet calculateEffectiveStats() {
int effectiveHitpoints =
baseStats.getHitpoints() + (trainedStats.getHitpoints() / 4);
int effectiveAttack =
baseStats.getAttack() + (trainedStats.getAttack() / 4);
int effectiveDefense =
baseStats.getDefense() + (trainedStats.getDefense() / 4);
return StatSetFactory.createImmutableStatSet(effectiveHitpoints, effectiveAttack, effectiveDefense);
}
প্রশিক্ষিত স্ট্যাটাস প্রতিটি যুদ্ধের পরে বাড়ানো হয়
public void grantExperience() {
int hitpointsReward = 0;
int attackReward = 0;
int defenseReward = 0;
final StatSet enemyStats = enemy.getEffectiveStats();
final StatSet currentStats = player.getEffectiveStats();
if (enemyStats.getHitpoints() >= currentStats.getHitpoints()) {
hitpointsReward++;
}
if (enemyStats.getAttack() >= currentStats.getAttack()) {
attackReward++;
}
if (enemyStats.getDefense() >= currentStats.getDefense()) {
defenseReward++;
}
final MutableStatSet trainedStats = player.getTrainedStats();
trainedStats.increaseHitpoints(hitpointsReward);
trainedStats.increaseAttack(attackReward);
trainedStats.increaseDefense(defenseReward);
}
তবে যুদ্ধের পরে এগুলি বাড়ানো হয়নি। নির্দিষ্ট আইটেম ব্যবহার করা, নির্দিষ্ট কৌশল প্রয়োগ করা, রণক্ষেত্রের চৌকস ব্যবহার সবই বিভিন্ন অভিজ্ঞতা প্রদান করতে পারে।
এখন আমার প্রশ্নের জন্য:
- অ্যাক্সেসর এবং মিউটরদের পৃথক ইন্টারফেসে বিভক্ত ইন্টারফেসের কোনও নাম আছে?
- এগুলিকে এভাবে ভাগ করে নেওয়া যদি তারা ব্যবহার করার মতো সমান সম্ভাবনা থাকে তবে আমার পরিবর্তে অন্য কোনও গ্রহণযোগ্য প্যাটার্ন ব্যবহার করা উচিত (উদাহরণস্বরূপ
Foo foo = FooFactory.createImmutableFoo();
যা প্রত্যাবর্তন করতে পারেDefaultFoo
বা প্রত্যাবর্তনেরDefaultMutableFoo
কারণে লুকিয়ে রয়েছে )?createImmutableFoo
Foo
- এই প্যাটার্নটি ব্যবহার করার জন্য অবিলম্বে কোন প্রত্যাশাযোগ্য ডাউনসাইড রয়েছে, ইন্টারফেসের ক্রমবিকাশের জটিলতার জন্য সংরক্ষণ করুন?
আমি এটি এইভাবে ডিজাইন করা শুরু করার কারণটি হ'ল আমি এমন মানসিকতার কারণ যে কোনও ইন্টারফেসের সমস্ত বাস্তবায়নকারীকে সহজতম ইন্টারফেসটি মেনে চলা উচিত এবং আরও কিছু সরবরাহ করা উচিত নয়। ইন্টারফেসে সেটার যুক্ত করে, এখন কার্যকর পরিসংখ্যানগুলি এর অংশগুলি থেকে স্বাধীনভাবে পরিবর্তন করা যেতে পারে।
EffectiveStatSet
আমরা কোনওভাবে কার্যকারিতা প্রসারিত করছি না এর জন্য একটি নতুন শ্রেণি তৈরি করা তেমন অর্থবোধ করে না। আমরা বাস্তবায়ন পরিবর্তন করতে এবং EffectiveStatSet
দুটি পৃথক করে একটি সংমিশ্রণ তৈরি করতে পারতাম StatSets
, তবে আমি মনে করি এটি সঠিক সমাধান নয়;
public class EffectiveStatSet implements StatSet {
public EffectiveStatSet(StatSet baseStats, StatSet trainedStats) {
// ...
}
public int getHitpoints() {
return baseStats.getHitpoints() + (trainedStats.getHitpoints() / 4);
}
}