অন্যরা কেন খুব তাড়াতাড়ি নিক্ষেপ করতে হবে তা পুরোপুরি সংক্ষেপে জানিয়েছেন । পরিবর্তে দেরী অংশটি কেন ধরতে হবে সে সম্পর্কে আমাকে কেন্দ্রীভূত করা যাক , যার জন্য আমি আমার স্বাদের জন্য সন্তোষজনক ব্যাখ্যা দেখিনি।
ব্যতিক্রম কেন?
ব্যতিক্রমগুলি কেন প্রথম স্থানে রয়েছে তা নিয়ে বেশ বিভ্রান্তি রয়েছে বলে মনে হয়। আমাকে এখানে বড় গোপনীয়তা ভাগ করে নিতে দাও: ব্যাতিক্রমের কারণ এবং ব্যতিক্রম হ্যান্ডেলিং হ'ল ... বিমূর্তি ।
আপনি কি কোডটি দেখেছেন:
static int divide(int dividend, int divisor) throws DivideByZeroException {
if (divisor == 0)
throw new DivideByZeroException(); // that's a checked exception indeed
return dividend / divisor;
}
static void doDivide() {
int a = readInt();
int b = readInt();
try {
int res = divide(a, b);
System.out.println(res);
} catch (DivideByZeroException e) {
// checked exception... I'm forced to handle it!
System.out.println("Nah, can't divide by zero. Try again.");
}
}
ব্যতিক্রমগুলি কীভাবে ব্যবহার করা উচিত তা তা নয়। উপরের মত কোডটি বাস্তব জীবনে বিদ্যমান, তবে এগুলি আরও ক্ষুণ্ন হয় এবং সত্যই ব্যতিক্রম (শ্লেষ)। উদাহরণস্বরূপ বিভাগের সংজ্ঞা , এমনকি খাঁটি গণিতেও শর্তযুক্ত: ইনপুট ডোমেনকে সীমাবদ্ধ রাখতে সর্বদা "কলার কোড" হ'ল শূন্যের ব্যতিক্রমী কেসটি পরিচালনা করতে হবে। এটা কুৎসিত. এটি কলারের পক্ষে সর্বদা ব্যথা হয়। তবুও, এই জাতীয় পরিস্থিতিতে চেক-টু-ডু- প্যাটার্ন হ'ল প্রাকৃতিক উপায়:
static int divide(int dividend, int divisor) {
// throws unchecked ArithmeticException for 0 divisor
return dividend / divisor;
}
static void doDivide() {
int a = readInt();
int b = readInt();
if (b != 0) {
int res = divide(a, b);
System.out.println(res);
} else {
System.out.println("Nah, can't divide by zero. Try again.");
}
}
বিকল্পভাবে, আপনি ওওপি স্টাইলে সম্পূর্ণ কমান্ডো যেতে পারেন:
static class Division {
final int dividend;
final int divisor;
private Division(int dividend, int divisor) {
this.dividend = dividend;
this.divisor = divisor;
}
public boolean check() {
return divisor != 0;
}
public int eval() {
return dividend / divisor;
}
public static Division with(int dividend, int divisor) {
return new Division(dividend, divisor);
}
}
static void doDivide() {
int a = readInt();
int b = readInt();
Division d = Division.with(a, b);
if (d.check()) {
int res = d.eval();
System.out.println(res);
} else {
System.out.println("Nah, can't divide by zero. Try again.");
}
}
আপনি দেখতে পাচ্ছেন, কলার কোডটিতে প্রি-চেকের বোঝা রয়েছে তবে পরে কোনও ব্যতিক্রম হ্যান্ডলিং করে না। যদি কোনও ArithmeticException
কলিং থেকে আসে divide
বা আসে eval
, তবে আপনারা হ'ল ব্যতিক্রমগুলি হ্যান্ডলিং করতে হবে এবং আপনার কোডটি ঠিক করতে হবে, কারণ আপনি এটি ভুলে গেছেন check()
। একই কারণের জন্য একটি NullPointerException
প্রায়শই প্রায়শই করা ভুল জিনিস।
এখন কিছু লোক আছেন যারা বলছেন যে তারা পদ্ধতি / ফাংশন স্বাক্ষরের ব্যতিক্রমী মামলাগুলি দেখতে চান, অর্থাত্ আউটপুট ডোমেনটি স্পষ্টভাবে প্রসারিত করতে । তারাই পরীক্ষিত ব্যতিক্রমগুলির পক্ষে । অবশ্যই, আউটপুট ডোমেন পরিবর্তন করার জন্য যে কোনও সরাসরি কলার কোডটি মানিয়ে নিতে বাধ্য করা উচিত এবং এটি চেক ব্যতিক্রমগুলির সাথে অর্জন করা উচিত। তবে এর জন্য আপনাকে ব্যতিক্রমের দরকার নেই! এজন্য আপনার Nullable<T>
জেনেরিক ক্লাস , কেস ক্লাস , বীজগণিত ডেটা ধরণের এবং ইউনিয়নের ধরণ রয়েছে । কিছু OO লোক এমনকি সাধারণ ত্রুটিযুক্ত মামলায় ফিরে আসতে পছন্দ করতে পারে null
:
static Integer divide(int dividend, int divisor) {
if (divisor == 0) return null;
return dividend / divisor;
}
static void doDivide() {
int a = readInt();
int b = readInt();
Integer res = divide(a, b);
if (res != null) {
System.out.println(res);
} else {
System.out.println("Nah, can't divide by zero. Try again.");
}
}
প্রযুক্তিগতভাবে ব্যতিক্রমগুলি উপরের মতো উদ্দেশ্যে ব্যবহার করা যেতে পারে, তবে এখানে মূল বিষয়টি: এই ধরনের ব্যবহারের জন্য ব্যতিক্রমগুলি বিদ্যমান নেই । ব্যতিক্রমগুলি অ্যাবস্ট্রাকশন are ব্যতিক্রম ইন্ডিয়ারেশন সম্পর্কে। ব্যতিক্রমগুলি সরাসরি ক্লায়েন্টের চুক্তিগুলি না ভেঙে "ফলাফল" ডোমেনকে প্রসারিত করার এবং "অন্য কোথাও" স্থির করে ত্রুটি হ্যান্ডল করার অনুমতি দেয়। আপনার কোড ব্যতিক্রম যা একই কোডের সরাসরি কলারের মধ্যে পরিচালনা করা হয়, তাদের মধ্যে বিমূর্ততা কোন স্তর ছাড়া ছোঁড়ার, তাহলে আপনি তা করছেন ভুল
দেরিতে কীভাবে ধরা যায়?
তাই আমরা এখানে. উপরের পরিস্থিতিগুলিতে ব্যতিক্রমগুলি ব্যবহার করা ব্যতিক্রমগুলি কীভাবে ব্যবহার করা হয় তা বোঝানোর জন্য আমি এটি দেখানোর পক্ষে যুক্তি দেখিয়েছি। একটি প্রকৃত ব্যবহারের কেস বিদ্যমান রয়েছে, যেখানে ব্যতিক্রম পরিচালনা দ্বারা প্রস্তাবিত বিমূর্ততা এবং দিকনির্দেশ অপরিহার্য। এই জাতীয় ব্যবহার বুঝতে পেরে দেরি করে দেওয়া সুপারিশটি বুঝতে সহায়তা করবে ।
যে ব্যবহারের কেসটি হ'ল: রিসোর্স অ্যাস্ট্রাকশনসের বিরুদ্ধে প্রোগ্রামিং ...
হ্যাঁ, ব্যবসায়ের যুক্তিগুলি বিমূর্ততার বিরুদ্ধে প্রোগ্রাম করা উচিত , কংক্রিট বাস্তবায়ন নয়। শীর্ষ স্তরের আইওসি "ওয়্যারিং" কোডটি রিসোর্স অ্যাবস্ট্রাকশনগুলির কংক্রিট বাস্তবায়নগুলি তাত্ক্ষণিকভাবে উত্সাহিত করবে এবং এগুলিকে ব্যবসায়িক যুক্তিতে সরিয়ে দেবে। এখানে নতুন কিছু নেই। কিন্তু এই সংস্থানগুলি বিমূর্তকরণগুলির কংক্রিট বাস্তবায়নগুলি সম্ভবত তাদের নিজস্ব প্রয়োগের নির্দিষ্ট ব্যতিক্রমগুলি ছুঁড়ে ফেলতে পারে , তাই না?
তাহলে এই প্রয়োগগুলি নির্দিষ্ট ব্যতিক্রমগুলি কে পরিচালনা করতে পারে? তখন কি ব্যবসার যুক্তিতে কোনও সংস্থান নির্দিষ্ট ব্যতিক্রমগুলি পরিচালনা করা সম্ভব? না, তা নয়। ব্যবসায়ের যুক্তি বিমূর্ততার বিরুদ্ধে প্রোগ্রাম করা হয়, যা নির্দিষ্টকরণের ব্যতিক্রম সম্পর্কিত নির্দিষ্ট বিবরণগুলির জ্ঞানকে বাদ দেয় না।
"আহা!", আপনি হয়ত বলতে পারেন: "তবে সে কারণেই আমরা ব্যতিক্রমগুলি সাবক্লাস করতে পারি এবং ব্যতিক্রম শ্রেণিবিন্যাস তৈরি করতে পারি" ( মিঃ স্প্রিং দেখুন !)। আমি আপনাকে বলি, এটি একটি ভ্রান্তি। প্রথমত, ওওপি-র প্রতিটি যুক্তিসঙ্গত বই বলে যে কংক্রিটের উত্তরাধিকার খারাপ, তবুও কোনওভাবেই জেভিএমের এই মূল উপাদানটি ব্যতিক্রম হ্যান্ডলিং কংক্রিটের উত্তরাধিকারের সাথে ঘনিষ্ঠভাবে জড়িত। হাস্যকর বিষয় হল, জোশুয়া ব্লচ কোনও কার্যকর জেভিএমের অভিজ্ঞতা অর্জনের আগে তার কার্যকর জাভা বইটি লিখতে পারতেন না , তিনি কি? এটি পরবর্তী প্রজন্মের জন্য "পাঠ শিখানো" বইয়ের আরও বেশি কিছু। দ্বিতীয়ত, এবং আরও গুরুত্বপূর্ণ, আপনি যদি উচ্চ-স্তরের ব্যতিক্রম ধরেন তবে আপনি কীভাবে এটি পরিচালনা করতে চলেছেন?PatientNeedsImmediateAttentionException
: আমাদের কি তাকে একটা বড়ি দিতে হবে বা পা কেটে ফেলতে হবে !? সমস্ত সম্ভাব্য সাবক্লাসের উপর একটি স্যুইচ স্টেটমেন্ট সম্পর্কে কীভাবে? আপনার পলিমারফিজমটি সেখানে যায়, বিমূর্ততাটি সেখানে যায়। তুমি ঠিকমত বুঝেছ.
তাহলে রিসোর্স নির্দিষ্ট ব্যতিক্রমগুলি কে পরিচালনা করতে পারে? এটা অবশ্যই যারা সিদ্ধান্তগুলি জানেন! যিনি রিন্সট্যান্ট করেছেন রিসোর্স! "ওয়্যারিং" কোড অবশ্যই! এটা দেখ:
ব্যবসায়িক যুক্তি অ্যাবস্ট্রাকশনগুলির বিরুদ্ধে কোডেড ... কোনও সংস্থান পুনরুদ্ধারের ত্রুটি হ্যান্ডলিং!
static interface InputResource {
String fetchData();
}
static interface OutputResource {
void writeData(String data);
}
static void doMyBusiness(InputResource in, OutputResource out, int times) {
for (int i = 0; i < times; i++) {
System.out.println("fetching data");
String data = in.fetchData();
System.out.println("outputting data");
out.writeData(data);
}
}
এদিকে অন্য কোথাও কংক্রিট বাস্তবায়ন ...
static class ConstantInputResource implements InputResource {
@Override
public String fetchData() {
return "Hello World!";
}
}
static class FailingInputResourceException extends RuntimeException {
public FailingInputResourceException(String message) {
super(message);
}
}
static class FailingInputResource implements InputResource {
@Override
public String fetchData() {
throw new FailingInputResourceException("I am a complete failure!");
}
}
static class StandardOutputResource implements OutputResource {
@Override
public void writeData(String data) {
System.out.println("DATA: " + data);
}
}
এবং অবশেষে তারের কোড ... কংক্রিট সংস্থান ব্যতিক্রমগুলি কে পরিচালনা করে? তাদের সম্পর্কে কে জানে!
static void start() {
InputResource in1 = new FailingInputResource();
InputResource in2 = new ConstantInputResource();
OutputResource out = new StandardOutputResource();
try {
ReusableBusinessLogicClass.doMyBusiness(in1, out, 3);
}
catch (FailingInputResourceException e)
{
System.out.println(e.getMessage());
System.out.println("retrying...");
ReusableBusinessLogicClass.doMyBusiness(in2, out, 3);
}
}
এখন আমার সাথে সহ্য করুন। উপরের কোড হল সরল। আপনি বলতে পারেন যে আপনার কাছে আইওসি ধারক পরিচালিত সংস্থাগুলির একাধিক স্কোপ সহ একটি এন্টারপ্রাইজ অ্যাপ্লিকেশন / ওয়েব ধারক রয়েছে এবং আপনার স্বয়ংক্রিয় পুনরায় চেষ্টা এবং অধিবেশন পুনরায় পুনর্নির্মাণ বা স্কোপ রিসোর্সগুলির অনুরোধ করা ইত্যাদি প্রয়োজন lower সংস্থান তৈরি করুন, সুতরাং সঠিক বাস্তবায়ন সম্পর্কে সচেতন না। এই নিম্ন স্তরের সংস্থানগুলি কী ব্যতিক্রম করতে পারে তা কেবলমাত্র উচ্চ স্তরের স্কোপগুলিই সত্যিই জানতে পারে। এবার ধর!
দুর্ভাগ্যক্রমে, ব্যতিক্রমগুলি কেবল কল স্ট্যাকের উপরে ইন্ডিয়ারেশনের অনুমতি দেয় এবং বিভিন্ন কার্ডিনালিটির সাথে বিভিন্ন স্কোপগুলি সাধারণত একাধিক ভিন্ন থ্রেডে চালিত হয়। ব্যতিক্রম ছাড়া এর মাধ্যমে যোগাযোগের কোনও উপায় নেই। আমাদের এখানে আরও শক্তিশালী কিছু দরকার। উত্তর: অ্যাসিঙ্ক বার্তা পাস হচ্ছে । নিম্ন স্তরের সুযোগের মূলটিতে প্রতিটি ব্যতিক্রম ধরা C কিছু উপেক্ষা করবেন না, কিছু যাতে পিছলে না যায়। এটি বর্তমান সুযোগের কল স্ট্যাকের তৈরি সমস্ত সংস্থানগুলি বন্ধ এবং নিষ্পত্তি করবে। তারপরে ব্যতিক্রম হ্যান্ডলিং রুটিনে বার্তা সারি / চ্যানেল ব্যবহার করে ত্রুটি বার্তাগুলি উচ্চতর আকারে প্রচার করুন, যতক্ষণ না আপনি সিদ্ধান্তটি জানা যায় known এই লোকটি যিনি এটি পরিচালনা করতে জানেন।
সুমা সমারাম
সুতরাং আমার ব্যাখ্যা অনুসারে দেরি করার অর্থ সবচেয়ে সুবিধাজনক স্থানে ব্যতিক্রমগুলি ধরা যেখানে আপনি আর কোনও সংক্ষেপণ বন্ধ করছেন না । খুব তাড়াতাড়ি ধরবেন না! আপনি যে স্তরে রিসোর্স অ্যাবস্ট্রাকশনগুলির উদাহরণ নিক্ষেপকারী কংক্রিট ব্যতিক্রমগুলি তৈরি করেন সেখানে স্তর ব্যতিক্রমগুলি ধরুন, যে স্তরটি বিমূর্ততার কনক্রেশনগুলি জানে । "তারের" স্তর।
আছে HTH। শুভ কোডিং!