Showing posts with label java programming. Show all posts
Showing posts with label java programming. Show all posts

Thursday, August 3, 2017

কিভাবে মার্শাল আর্টের ধারণা আপনাকে জাভাতে মাস্টার হতে সাহায্য করে? (How martial art helps you to master Java)

Shu, Ha, Ri এই শব্দ তিনটি এসেছে জাপানি মার্শাল আর্টসের কনসেপ্ট থেকে। এটি সাধারণত কোনো কিছু শেখার ক্ষেত্রে ব্যবহার করা হয়। শব্দ তিনটির অর্থ করলে দাঁড়ায় - 

১. shu (守) "protect", "obey" বা মান্য করা
২. ha (破) "detach", "digress", “break” ভাঙ্গা বা বিচ্ছিন্ন করা 
৩. ri (離) "leave", "separate" আলাদা হওয়া 

জাভা প্রোগ্রামিং শেখার ক্ষেত্রে এই তিনটি ধারণা ব্যবহার করা যেতে পারে। কীভাবে তা নিয়েই এই আলোচনা- 

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

অর্থাৎ প্রথমে কী করতে হবে এবং এগুলো কীভাবে করতে হয় এগুলো নিয়ে বেশি মনোযোগী হওয়া উচিৎ, এ পর্যায়ে প্রত্যেকটি বিষয়ের অন্তর্নিহিত তত্ত্ব সম্পর্কে চিন্তা না করলেও চলবে।

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

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

তৃতীয়ত রু, এই পর্যায়ে শিক্ষার্থী অন্যদের কাছে না শিখে বরং নিজেই নিজের কাছে শিখতে শুরু করে নিজের অনুশীলনের মাধ্যমে। এই পর্যায়ে নিজস্ব স্বকীয়তা তৈরি হয়। যেমন -

- কীভাবে কোড লিখবে, কোডটি ফাংশনাল বা অবজেক্ট ওরিয়েন্টেড হবে কিনা,
- ল্যামডা এক্সপ্রেশন ব্যবহার করা হবে নাকি হবে না,
- জাভা এন্টারপ্রাইজ এডিশন ব্যবহার করবে নাকি স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করবে,
- হাইবারনেট ব্যবহার করবো নাকি Plain JDBC দিয়ে কাজ করা যাবে

ইত্যাদি ব্যাপারে নিজস্ব মতামত তৈরি হয়।

Monday, June 5, 2017

জাভাতে কীভাবে ক্লাস লোড করা হয়


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

একটি ক্লাস ফাইলে বাইটকোড থাকে। এই বাইটকোড হলো বিশেষ ইন্সট্রাকশন যা জাভা ভার্চুয়াল মেশিন এক্সিকিউট করে। তাহলে এই বাইটকোডগুলোকে এক্সিকিউট করতে হলে জাভা ভার্চুয়াল মেশিনকে এই বাইটকোড প্রসেস করতে হয়। এই প্রসেসের প্রক্রিয়া শুরু হয় লোডিং ও লিংকিং (loading and linking) এর মাধ্যমে।

এবার এই ক্লাস লোডিং ও লিংকিং প্রক্রিটি দেখা যাক - 

ক্লাস লোডিং (Class Loading)

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


লিংকিং (Linking)

ক্লাস লােড হওয়ার পরের ধাপ হলো লিংকিং। এই ধাপ সংগঠিত হয় তিনটি ধাপে। এগুলো হলো - 
১. ভ্যারিফিকেশন (Verification)
২. প্রিপারেশন (Preparation)
৩. রেজ্যুলুশন (Resolution)

ভ্যারিফিকেশন প্রক্রিয়া দেখা হয় কোনো ক্লাসের ফরম্যাট ঠিক আছে কিনা, বা এটি রানটাইমে কোনো প্রকার সমস্যা তৈরি করবে কিনা। ভ্যারিফিকেশনে সবকিছু ঠিকঠাক থাকলে ক্লাসটি ব্যবহারের জন্য তৈরি করা হয়। একটি ক্লাসে অন্য ক্লাসের রেফারেন্স থাকতে পারে। এরপরের ধাপে যে ক্লাসগুলো রেফারেন্স করা হয়েছে সেগুলো জাভা রানটাইমের কাছে পরিচিত কিনা তা দেখা হয়। 

ভ্যারিফিকেশন (Verification)

এটি বেশ জটিল একটি প্রক্রিয়া। এটি বেশকতগুলো ধাপে সংগঠিত হয়। 

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


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

প্রিপারেশন (Preparation)

এ প্রক্রিয়ায় ক্লাসে কোনো স্ট্যটিক ফিল্ড থাকলে সেগুলোকে তৈরি করা ও ইনিশিয়ালাইজ করা হয়। কিন্তু এ ধাপে জাভা ভার্চুয়াল মেশিনে কোনো বাইটকোড ইন্সট্রাকশন এক্সিকিউট হয় না। 

রেজ্যুলুশন (Resolution) 

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

এই ধাপ সম্পন্ন হওয়ার পর একটি ক্লাস ব্যবহারের জন্য তৈরি হয়ে যায়।



-->

Saturday, April 15, 2017

ল্যামডা এক্সপ্রেশনঃ পর্ব এক (Lambda Expression: Part 1)

অনেকগুলো জনপ্রিয় প্রোগ্রামিং ল্যাংগুয়েজেই ল্যামডা এক্সপ্রেশন রয়েছে। যেমন- জাভাস্ক্রিপ্ট, পাইথন, গ্রুভি, স্ক্যালা, সি শার্প, সি++ ইত্যাদি। জাভাতে এই বিশেষ ফিচারটি অনেকদিন অনুপস্থিত থাকায় জাভা প্রোগ্রামারদের মধ্যে মনোকষ্টের কমতি ছিল না। ২০০৬ সালে জাভা পাঁচ রিলিজ হওয়ার পর এই ফিচারটি নিয়ে আলোচনা শুরু হলেও এটি খুব একটা আলোর মুখ দেখে নি। অনেকেই বলতে শুরু করে "Java is the new COBOL”। তবে জাভাকে ওরাকল কিনে নেওয়ার পর এই অবস্থার পরিবর্তন হতে শুরু করে এবং অবশেষে প্রোগ্রামারদের প্রবল মনোবেদনা ঘুচিয়ে ২০১৪ সালে রিলিজ হয় জাভা আট যাতে এই বিশেষ এবং খুবই গুরুত্বপূর্ণ ফিচারটি সংযুক্ত করা হয়।

চলুন তাহলে এই বিশেষ প্রোগ্রামিং ফিচার, ল্যামডা এক্সপ্রেশন নিয়ে আলোচনা করা যাক।


ল্যামডা এক্সপ্রেশনঃ

ল্যামডা টার্মটি এসেছে ল্যম্বডা ক্যালকুলাস (Lambda Calculus) থেকে। এটি গণিতিক যুক্তি ও কম্পিউটার সাইন্সে ব্যবহৃত এক ধরণের ফর্মাল সিস্টেম যাতে বিভিন্ন ধরণের কম্পিউটিশন বিভিন্ন ভ্যারিয়েবলের মাধ্যমে প্রকাশ করা হয়। তবে এই আমাদের এই আলোচনায় তাত্বিক দিকটি পরিহার করে বরং সাধারণভাবে এর আচরণ ও ব্যবহার নিয়ে কথা বলা যাক। 

সহজকরে বলা যেতে পারে যে, ল্যমডা এক্সপ্রেশন হলো একটি ছোট কোড যা কোনো কাজ করে থাকে। উদহারণ-

(int x) → {return x +1;}

উপরের কোডটি একটি ল্যামডা এক্সপ্রেশনের উদাহরণ। এটি দেখে মনে হচ্ছে একটি মেথড কিন্তু এর কোনো নাম নেই। এতে একটি মেথডে যা কিছু থাকে তার পায় সবই রয়েছে, যেমন – প্যারামিটার, মেথড বডি। তবে এতে রিটার্ন টাইপ দেখা যাচ্ছে না। রিটার্ন টাইপ এক্ষেত্রে কম্পাইলার বুঝে নিতে পারে, কারণ এর রিটার্ন স্ট্যাটমেন্টে দেখা যাচ্ছে যে এটি একটি ইন্টিজার রিটার্ন করছে। তাহলে একে বলতে পারি নাম ছাড়া মেথড বা অ্যানোনিমাস মেথড।


অ্যানোনিমাস ইনার ক্লাস ও ল্যাম্ডা এক্সপ্রেশন

জাভা অ্যানোনিমাস ইনার ক্লাস তৈরি করতে দেয় এবং এর বিভিন্ন রকম ব্যবহার রয়েছে। এটিও একধরণের ক্লাস তবে এর কোনো নাম নেই। এটি সাধারণত অন্য একটি ক্লাসের মধ্যে তৈরি করা হয় বলে একে অ্যানোনিমাস ইনার ক্লাস বলা হয়। অ্যানোনিমাস ক্লাস দুই ভাবে তৈরি করা যায়- ইন্টারফেস থেকে এবং একটি ক্লাস থেকে।


1
2
3
public interface Filterable {
     boolean apply(Object obj);
}

উপরের ইন্টারফেইসটি থেকে একটি অ্যানোনিমাস ইনার ক্লাস তৈরি করা যেতে পারে।


1
2
3
4
5
6
7
new Filterable() {
    @Override
    public boolean apply(Object object) {
 // other logic 
        return false;
    }
};

এখানে ইন্টারফেস থেকে একটি ইনার ক্লাস তৈরি করা হয়েছে। এখানে লক্ষ করুন, ইন্টারফেসের সঙ্গে একটি নিউ অপারেটর ব্যবহার করা হয়েছে এবং কার্লি ব্রেসের মধ্যে ইন্টারফেইসটির মেথডটি ইম্প্লিেমেন্ট করা হয়েছে। অর্থাৎ অ্যানোনিমাস ইনার ক্লাস তৈরি করতে হলে নিউ অপারেটর ব্যবহার করতে হয়।

একইভাবে ক্লাস থেকেও অ্যানোনিমাস ইনার ক্লাস তৈরি করা যায়। যে ক্লাস থেকে অ্যানোনিমাস ক্লাস তৈরি করা হবে সেই ক্লাসটিকে অ্যানোনিমাস ইনার ক্লাস ইনহেরিট করে। উদাহরণ-


1
2
3
4
5
new Person() {
    public void doSomething() {
        System.out.println("doing something");
    }
};

এখানে Person ক্লাস ব্যবহার করে একটি অ্যানোনিমাস ক্লাস তৈরি করা হয়েছে। তবে এই পদ্ধতি নিয়ে এই অনুচ্ছেদে এর বেশি আলোচনা হবে না।

এবার চলুন এই অ্যানোনিমাস ইনার ক্লাসের সুবিধা নিয়ে আলোচনা করা যাক -

মনে করুন, আপনার কাছে একটি কন্টাক্ট লিস্ট আছে। আপনি এই কন্টাক্ট লিস্ট থেকে নানাভাবে কন্টাক্টগুলোকে ফিল্টার করতে চান।

আপনার কন্টাক্ট ক্লাসটি দেখতে এরকম-


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Contact {
    enum Sex {
        MALE, FEMALE
    }

    private String name;
    private String emailAddress;
    private String phoneNumber;
    private int age;
    private Sex sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Sex getSex() {
        return sex;
    }

    public void setSex(Sex sex) {
        this.sex = sex;
    }
}

এখন আপনি একটি মেথড লিখতে পারেন, যা আপনার লিস্ট থেকে যাদের বয়স ১৮ থেকে ২৫ এর মধ্যে তাদেরকে আলাদা করবে। মেথডটি এভাবে লেখা যেতে পারে -



1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import java.util.ArrayList;
import java.util.List;

public class ContactService {
    public List<Contact> findContactAgedBetween18And25(List<Contact> contactList) {
        List<Contact> contacts = new ArrayList<>();
        
        for (Contact contact : contactList) {
            if (contact.getAge() >= 18 && contact.getAge() <= 25) {
                contacts.add(contact);
            }
        }
        return contacts;
    }
}

এক্ষেত্রে এই মেথড প্রথমে কন্টাক্ট লিস্ট থেকে একটি ফর লুপ এবং একটি ইফ স্ট্যাটমেন্ট ব্যবহার করে প্রত্যেকটি কন্টাক্ট পরীক্ষা করে দেখছে যে এদের বয়স ১৮ থেকে ২৫ এর মধ্যে কিনা। তারপর মেথডের মধ্যে একটি লোকাল ভ্যারিয়েলে সেগুলো রাখছে এবং লুপ শেষ হয়ে গেলে রিটার্ন করছে।

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


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public List<Contact> findContactMaleAgedBetween18And25(List<Contact> contactList) {
    List<Contact> contacts = new ArrayList<>();

    for (Contact contact : contactList) {
        if (contact.getAge() >= 18
                && contact.getAge() <= 25
                && contact.getSex() == Contact.Sex.MALE) {
            contacts.add(contact);
        }
    }

    return contacts;
}

এভাবে যদি মহিলাদের আলাদা করতে চান তাহলে -


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public List<Contact> findContactFemaleAgedBetween18And25(List<Contact> contactList) {
    List<Contact> contacts = new ArrayList<>();

    for (Contact contact : contactList) {
        if (contact.getAge() >= 18
                && contact.getAge() <= 25
                && contact.getSex() == Contact.Sex.FEMALE) {
            contacts.add(contact);
        }
    }

    return contacts;
}

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

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


1
2
3
interface FilterCriteria {
    boolean match(Contact contact);
}

এখন আমরা একটি মেথড লিখবো যেখানে এই ইন্টারফেইসটি প্যারামিটার হিসেবে থাকবে।


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public List<Contact> findContacts(List<Contact> contactList, FilterCriteria criteria) {
    List<Contact> contacts = new ArrayList<>();

    for (Contact contact : contactList) {
        if (criteria.match(contact)) {
            contacts.add(contact);
        }
    }

    return contacts;
}

এই লক্ষ্য করুন , আমরা উপরের মেথডের ইফ স্ট্যাটমেন্টটি সামন্য পরিবর্তন করেছি। এটিতে কোনো নির্দিষ্ট লজিক নেই, বরং এটি আমাদের ইন্টারফেসটির একটি মেথডকে কল করছে যা কিনা বুলিয়ান রিটার্ন করে। এর অর্থ হলো- এই match() মেথডটি যেসব Contact এর ক্ষেত্রে true রিটার্ন করবে শুধুমাত্র সেগুলোকে ভেতরের লিস্টে যুক্ত করবে এবং রিটার্ন করবে। এখন এই মেথডটি ব্যবহার করে দেখা যাক-


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import java.util.ArrayList;
import java.util.List;

public class ContactApp {
    public static void main(String[] args) {
        List<Contact> contactList = new ArrayList<>(); // lets assume we have that list
        ContactService contactService = new ContactService();
        List<Contact> contactAged18To25 = contactService.findContacts(contactList, new FilterCriteria() {
            @Override
            public boolean match(Contact contact) {
                return contact.getAge() >= 18 && contact.getAge() <= 25;
            }
        });
    }
}

উপরের মেথডটিতে আর্গুমেন্ট হিসেবে একটি অ্যানোনিমাস ইনার ক্লাস দেওয়া হয়েছে যাতে আমরা match() মেথডের মূল লজিকটুকু লিখেছি। এভাবে আমাদের যদি এখন এই ১৮ থেকে ২৫ বছর বয়সের কন্টাক্টগুলো থেকে শুধুমাত্র মহিলাগুলোকে আলাদা করতে চাই তাহলে কন্টাক্ট সার্ভিসে(ContactService) নতুন কোনো মেথড যুক্ত করতে হবে না। শুধুমাত্র কল করার সময় আমাদের কোডের বিহেবিয়ারটুকু আর্গুমেন্ট হিসেবে পাস করলেই হয়ে যাচ্ছে।


1
2
3
4
5
6
7
8
List<Contact> contactAged18To25Female = contactService.findContacts(contactList, new FilterCriteria() {
    @Override
    public boolean match(Contact contact) {
        return contact.getAge() >= 18
                && contact.getAge() <= 25
                && contact.getSex() == Contact.Sex.FEMALE;
    }
});

এভাবে আমরা অ্যানোনিমাস ইনার ক্লাস ব্যবহার করে বিহেবিয়ার প্যারামিটারাইজড করতে পারি। এতে করে অনে কম কোড লিখে অনেক বেশি ফিচার তৈরি করা যাচ্ছে।

তবুও উপরের কোডটিতে খেয়াল করলে দেখা যাবে যে বেশ কিছু কোড বারবার লিখতে হচ্ছে।

চিত্র: প্রয়োজনীয় কোড লজিক

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

তবে জাভা ৮ ল্যাম্বডা এক্সপ্রশন আসার সুবাধে এই boilerplate কোডটুকুকেও বাদ দেওয়া যায়। উদাহরণ -


1
2
3
4
5
6
List<Contact> contactAged18To25Female = contactService.findContacts(contactList,
        (Contact contact) -> {
            return contact.getAge() >= 18
                    && contact.getAge() <= 25
                    && contact.getSex() == Contact.Sex.FEMALE;
        });

উপরের কোডটুকু লক্ষ্য করুন, এতে শুধুমাত্র প্রয়োজনীয় কোডটুকু রয়েছে। তাহলে আমাদের প্রথম ল্যাম্বডা এক্সপ্রেশন লেখা হয়ে গেলো।

এই প্যারামিটাইরাইজড কোডটুকু আলাদা করে লিখলে -


1
2
3
4
5
6
(Contact contact) -> {
    
    return contact.getAge() >= 18
            && contact.getAge() <= 25
            && contact.getSex() == Contact.Sex.FEMALE;
};

যা শুরুতে ল্যাম্বডা নিয়ে কথা বলার সময় যে উদাহরণ দেওয়া হয়েছিল তার সঙ্গে মিলে যায়।

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

আরও একটি ব্যবাহার দেখা যাক-


1
2
3
4
5
6
7
File root = new File("./");
File[] files = root.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return pathname.isFile();
    }
});

অনেক সময় আমাদের ফাইল লিস্টিং করতে হয়, অর্থাৎ একটি ফোল্ডারে যে ফাইলগুলো  রয়েছে তা বিভিন্নভাবে ফিল্টার করে তার লিস্ট করা যায়। এক্ষেত্রে উপরের কোডটি রুট ফোল্ডারে যে ফাইলগুলো ডিরেক্টরী নয় শুধুমাত্র ফাইল(জাভাতে ইউনিক্স সিস্টেম অনুসরণ করে ফাইল এবং ডিরেক্টরী দুটুই একটি ক্লাস java.io.File দিয়ে অ্যাবস্ট্র্যাক্ট করা হয়েছে), সেগুলোকে লিস্ট করবে।

তবে উপরের কোডটুকু সংক্ষিপ্ত করে ল্যামডা এক্সপ্রেশন ব্যবহাv করে এভাবে লেখা যায় -


1
File[] files = file.listFiles(pathname -&gt; pathname.isFile());

কিংবা আরও সংক্ষেপে -


1
File[] files = file.listFiles(File::isFile); //method reference

এখানে মেথড রেফারেন্স ব্যবহার করা হয়েছে।

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

Tuesday, March 7, 2017

জাভাতে কালেকশন ফ্রেমওয়ার্ক কী এবং এর প্রয়োজনীয়তা কী?

আমরা অনেক বড় একটি প্রোগ্রামকে ভাঙতে ভাঙতে কতগুলো ছোট ছোট টুকরো প্রোগ্রামে বিভ্ক্ত করি যেগুলো একে অন্যের সঙ্গে যোগাযোগ করতে পারে। এরপর সেই ছোট প্রোগ্রাম গুলোকে আরও ভাংগতে থাকি ততক্ষণ পর্যন্ত, যতক্ষণ না আমরা আরও ছোট অংশ পাই যেটি সহজে বোঝা ও ইম্প্লিমেন্ট করা যায় ঠিক যেভাবে ভাবে আমরা নানা রকম ইনফরমেশন সিস্টেম তৈরি করি। যেমন- বিটস থেকে বাইট, বাইট থেকে ক্যারেক্টার, তারপর নাম্বার, স্ট্রিং ইত্যাদি। আমরা জানি কীভাবে অবজেক্ট তৈরি করতে হয়। একটি রিয়েল লাইফ এনটিটিকে অবজেক্টে অ্যাবস্ট্রাক্ট করতে পারি। এভাবে অনেকগুলো অবজেক্ট দিয়ে অনেক বড়ো স্ট্রাকচার তৈরি করতে পারি।

একটা সময় ছিল যখন প্রোগ্রামারদেরকে বেসিক ডেটা স্ট্রাকচার তৈরি করতে এবং এদেরকে নিয়ে কাজ করানোর মতো অবস্থায় নিয়ে আসতে অনেক বেশি সময় ব্যয় করতে হতো। যেমন - যদি একটি সেট(Set) এর দরকার হয়, তাহলে স্ক্র্যাচ থেকে একটি সেট তৈরি করতে হতো। যদি একটি লিস্ট (List) বা ম্যাপ (Map) দরকার হতো, প্রচুর সময় এদের পেছনে ব্যয় করতো হতো। সবচেয়ে বড় সমস্যা ছিল যেটি ছিল যে- এগুলো সবসময় এররপ্রুন হতো। এতে করে একটি রিয়েল লাইফ সমস্যা সমাধান করতে গিয়ে প্রোগ্রামাদেরকে বেসিক সমস্যা নিয়ে বেশি মনযোগী হতে হতো।

তবে জাভা আমাদের এই সমস্যা থেকে মুক্তি দিয়েছে। জাভা লাইব্রেরিতে অনেকগুলো প্রয়োজনীয় ক্লাসের ইমপ্লিমেন্টাশন দেয়া আছে যেগুলো আমরা খুব সহজে ব্যবহার করতে পারি এবং এগুলো নিয়ে আমাদের খুব বেশি চিন্তা না করে মূল সমস্যা অর্থাৎ আমাদের রিয়েল লাইফ প্রোগ্রাম এর লজিক এবং উপাদান নিয়ে বেশি সময় দিতে পারি।

আর এই কমন ক্লাসগুলো নিয়েই কালেকশন ফ্রেমওয়ার্ক।

জাভাতে Declare type এবং Actual type কী?

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

Animal animal; 

এখানে animal একটি ভেরিয়েবল। যার টাইপ হচ্ছে Animal। এখন new কিওযার্ড ব্যবহার করে এতে একটি অবজেক্ট তৈরি করে এই ভেরিয়েবলে অ্যাসাইন করতে পারি।

Animal animal = new Animal(); 

এখানে animal ভেরিয়েবলটি একটি Animal এর একটি অবজেক্টের একটি রেফারেন্স ধরে রাখে। এক্ষেত্রে এই অবজেক্টের টাইপও এখানে Animal।

সাধারণভাবে ভেরিয়েবল টাইপ এবং অবজেক্ট টাইপ একই হলেও কখনো কখনো ভিন্ন হতে পারে। ধরা যাক, এই Animal ক্লাসকে এক্সটেন্ড করে আরেকটি ক্লাস তৈরি করা হলো, Dog. তাহলে new Dog দিয়ে যে অবজেক্ট তৈরি হবে তার টাইপ হবে  Dog.

Animal animal = new Dog(); 

উপরের উদাহরণটি খেয়াল করুন। এখানে ভেরিয়েবল টাইপ এবং অবজেক্ট টাইপ ভিন্ন। কিন্তু এই স্টেটমেন্টটি বৈধ। এর কারণ হলো - যেকোনো ভেরিয়েবলের টাইপের যেকোনো সাব-ক্লাসের অবজেক্টের রেফারেন্স রাখতে পারে। এর মানে হচ্ছে এই animal ভেরিয়েবলে যেকোনো Animal ক্লাসের সাব-ক্লাসের ইনস্ট্যান্স বা অবজেক্টের রেফারেন্স রাখতে পারি।

ঠিক একইভাবে, কোনো মেথডের প্যারামিটার যদি সুপার টাইপ হয়, সেখানে এর যেকোনো একটি সাবটাইপ এর অবজেক্ট এর রেফারেন্স আর্গুমেন্ট হিসেবে পাস করা যায়।

তাহলে এভাবেও বলতে পারি, ভেরিয়েবল টাইপ হচ্ছে ডিক্ল্যায়ার টাইপ। আর অবজেক্ট টাইপ হচ্ছে একচুয়াল টাইপ।

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

Wednesday, February 22, 2017

প্রোগ্রামিং আড্ডা: জাভা প্রোগ্রামিং ও অ্যান্ড্রয়েড: দশটি প্রশ্নের উত্তর

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


আড্ডাটির ইউটিউব ভিডিও লিংকটিও নিচে দেওয়া হলোঃ




প্রশ্নঃ বাংলাদেশে তো জাভাতে কাজ করে এমন সফটওয়্যার ফার্মের সংখ্যা কম, সুতরাং জাভা শিখে কী লাভ আছে ?
উত্তরঃ বাংলাদেশে মোটেও জাভাতে কাজ করে এমন সফটওয়্যার ফার্মের সংখ্যা কম নয়। জাগবিডিতে একটা সার্ভে করা হয়েছিল তাতে যে সংখ্যা পাওয়া যায়, তার সংখ্যা মোটেও কম নয়। তাছাড়া সামগ্রিকভাবে বাংলাদেশের সফটওয়ার ইন্ডাস্ট্রি এতো বড় নয়। সার্ভেটির লিংক এখানে পাওয়া যাবে- https://goo.gl/O9mJf5


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

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


প্রশ্নঃ বিশ্ববিদ্যালয়ের কোর্সে সুইং শেখানো হচ্ছে, জাভা সুইং দিয়ে কী কী করা যায়? ডেস্কটপ অ্যাপ্লিকেশন কি সুইং দিয়ে করা হয়?
উত্তরঃ প্রথমত, বিশ্ববিদ্যালয়ের কোর্সে সুইং থাকা উচিৎ না। যেহেতু কোর্সে আছে, তাই আপানাকে শিখতে হবে, এখানে আসলে কিছু করার নেই। আগে জাভা দিয়ে ডেক্সটপ অ্যাপ্লিকেশন তৈরির জন্য সুইং ব্যবহার করা হতো, তবে এখন জাভাএফএক্স(JavaFx) ব্যবহার করা হয়। তবে আমি সুইং শেখার পরামর্শ দিচ্ছি না। কোর্সের জন্য যতটুকু দরকার ততটুকু শিখুন। অবজেক্ট ওরিয়েন্টেড কনসেপ্ট ও অন্যান্য দিকগুলোতে বেশি মনযোগ দিন।


প্রশ্নঃ সি না শিখে কী জাভা শেখা যায়।
উত্তরঃ সংক্ষিপ্ত উত্তর, হ্যা। তবে সি প্রোগ্রামিং আপানাকে প্রোগ্রামিংয়ের ধারণা তৈরি করতে সাহায্য করে। এ নিয়ে ধারণা পেতে হলে যেতে পারেন এই লিংকে: http://cpbook.subeen.com/


প্রশ্নঃ অ্যান্ড্রয়েড প্রোগ্রামিংয়ের জন্য জাভার কোন ভার্সনটি মাথায় রাখা উচিৎ?
উত্তরঃ অ্যান্ড্রয়েড জাভা ৭ এর সবগুলো ফিচার সাপোর্ট করে। জাভা ৮ এর সবগুলো না হলেও একটা বড় অংশ সাপোর্ট করে। জাভা ৮ এর নতুন ফিচারগুলো সাপোর্ট করার জন্য অ্যান্ড্রয়েড একটি নতুন কম্পাইলার ব্যবহার করে নাম Jack. বিস্তারিত পাওয়া যাবে এই লিংকে: https://developer.android.com/guide/platform/j8-jack.html


প্রশ্নঃ জাভার এন্টারপ্রাইজ এডিশন কী?
সাধারণত অনেক বড় ধরণের ব্যবসা প্রতিষ্ঠানে ব্যবহৃত অ্যাপ্লিকেশনগুলোতে এন্টাপ্রাইজ শব্দটি ব্যবহার করা হয়। বর্তমানে করপোরেট ইনভাইরনমেন্টে এন্টারপ্রাইজ অ্যাপ্লিকেশন বলতে খুব জটিল, ডিস্ট্রিবিউটেড, কম্পোনেন্ট বেইজড এবং মিশন ক্রিটক্যাল (mission-critical) অ্যাপ্লিকেশন বোঝায়। মিশন ক্রিটিক্যাল অ্যাপ্লিকেশন হলো সেগুলো, যেগুলো কোনো একটি বিশেষ ব্যবসায়িক উদ্দেশ্যে অ্যাপ্লিকেশনটি ব্যবহার করা হয়, যার উপর সম্পূর্ণ ব্যবসাটি নির্ভর করছে। কোন কারণে অ্যাপ্লিকেশনটি কাজ না করলে ব্যবসাটি ক্ষতিগ্রস্থ হয়। এগুলো বিভিন্ন ধরণের প্লাটফর্মের জন্য তৈরি করা হয়, এবং করপোরেট নেটওয়ার্কস, রেসট্রিকটেড নেটওয়ার্কস, ইন্টারনেটের মাধ্যমে ব্যবহার করা হয়, এগুলো খুব ইউজার ফ্রেন্ডলি, ডেটাসেন্ট্রিক, সিকিউরড, এডমিনিস্ট্রটিভ হয় এবং সহজে ম্যানিপুলেট করা যায়। মোটকথা এন্টাপ্রাইজ অ্যাপ্লিকেশন হলো খুব কমপ্লেক্স অ্যাপ্লিকেশন। যেমন- ডাটা স্টোরেজ করা এবং ইউজার রেসট্রিকটেড করা, কাস্টোমার ইনভয়েস, ফ্লাইট বুকিং করা, ব্যাংকিং সিস্টেম অটোমেশন, হেল্থ কেয়ার সিস্টেম এগুলো এন্টারপ্রাইজ অ্যাপ্লিকেশনের উদাহরণ। এগুলোর মাল্টিপল ইন্টারফেজ থাকে পারে, রিমুট কমিউনিকেশন করতে পারে, উন্নত ধরণের গ্রাফিক্যাল ইউজার ইন্টারফেজ থাকে। এটি জাভা স্ট্যান্ডার্ড এডিশনের উপর ভিত্তি করে তৈরি ওয়েব এবং অনেক বড় মাপের এন্টারপ্রাইজ অ্যাপ্লিকেশন তৈরি করার জন্য যে সব কম্পোনেন্ট দরকার হয় তার একটি বিশাল প্যাকেজ। এগুলোকে আলাদা করে নাম দেওয়া হয়েছে জাভা এন্টারপ্রাইজ এডিশন (JEE)। উদাহরণস্বরূপ এর কম্পোনেন্টগুলো হলো-
  • Servlets
  • Java Server Pages (JSP)
  • Java Server Faces (JSF)
  • Enterprise Java Beans (EJB)
  • Java Transaction API (JTA)
  • Java Persistence API (JPA)
  • RESTful Web Services (JAX-RS)
  • Bean Validation
  • Unified Expression Language (EL)
  • Context and Dependency Injection (CDI)
  • Java Message Service message queue API's (JMS)
  • Java WebSocket
  • JSON Processing API (JSON-P)
  • etc.

কিছু এন্টারপ্রাইজ অ্যাপ্লিকেশনের উদাহরণ হলো -

  • কাস্টোমার রিলেশনশিপ ম্যানেজমেন্ট
  • এন্টাপ্রোইজ রিসোর্স প্ল্যানিং
  •  কর্পোরেট আইডেন্টি ম্যানেজমেন্ট
  • কল সেন্টার ও কাস্টোমার সাপোর্ট অ্যাপ্লিকেশন
  • হেল্থ ইনফরমেশন সিস্টেম
  • অটোম্যাটেড বিলিং সিস্টেম
  • ফিনান্সিয়াল, অ্যাকাউন্টিং অ্যাপ্লিকেশন
  • এন্টাপ্রোইজ কন্টেন্ট ম্যানেজমেন্ট
  • বিসনেস প্রসেস ম্যানেজমেন্ট
  • বিসনেস ইন্টেলিজেন্স সফটওয়্যার
  • হিউমেন রিসোর্স ম্যানেজমেন্ট
  • ডকুমেন্ট ম্যানেজমেন্ট সিস্টেম
  • ইন্টারনেট পোর্টাল
ইত্যাদি।
জাভা এন্টারপ্রাইজ এডিশন নিয়ে দ্বিমিকের এই কোর্সটি দেখা যেতে পারে। লিংক: http://dimikcomputing.com/course/javaee-online-course/

প্রশ্নঃ জাভা প্রোগ্রামিং বইয়ে কী কী আছে ?
উত্তরঃ একজন নতুন শিক্ষার্থীর জাভা প্রোগ্রামিং ভাষার যে যে বিষয়গুলোর দিকে নজর দেওয়া উচিৎ সে বিষয়গুলোই এই বইয়ে আলোকপাত করার চেষ্টা করা হয়েছে। বইটি মূলত যারা ইতিমধ্যে একটি প্রোগ্রামিং ভাষা যেমন সি প্রোগ্রামিং ভাষার কিছুটা ধারণা আছে এবং নতুন একটি প্রোগ্রামিং ভাষা বিশেষ করে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা শিখতে চায় তাদের উদ্দেশ্য করে লেখা হয়েছে। এতে অনেকগুলো বিষয় খুবই গুরুত্বপূর্ণ হওয়া সত্যেও বাদ দেওয়া হয়ছে। যেমন - থ্রেড (Thread), জাভা মেমোরি মডেল (Java Memory Model), অ্যানোটেশন প্রসেসিং (Annotation Processing), ল্যামডা এক্সপ্রেশন (Lambda Expression), নেটওয়ার্কিং (Networking) ইত্যাদি। তবে এগুলোর সবগুলো এডভান্স জাভা প্রোগ্রামিংয়ের জন্য প্রয়োজন হয়। পরবর্তী খণ্ডে যুক্ত করার ইচ্ছা পোষণ করছি।
বইটি সম্পর্কে আরো বিস্তারিত পাওয়া যাবে এই লিংকে: https://goo.gl/FpfSvO 

প্রশ্নঃ ওয়েব প্রোগ্রামিংয়ের ক্ষেত্রে জাভার গুরুত্ব কতটুকু?
উত্তরঃ বর্তমানে সব সফ্টওয়্যারগুলোই মূলত ওয়েব বেইজড হয়ে থাকে। ওয়েব বেইজ অ্যাপ্লিকেশন গুলোর দুটো অংশ থাকে। এক- ব্রাউাজারে রিপ্রেজেন্টেশন যাকে ক্লায়েন্ট সাইড বলা হয়। দুই- ব্যাকএন্ড প্রোগ্রামিং। ক্লায়েন্ট প্রোগ্রামিংয়ের জন্য জাভাস্ক্রিপ্ট ছাড়া আর কোনো উপায় এখনো বের হয়নি। সুতরাং আপনি যদি ওয়েব প্রোগ্রামিং ক্ষেত্রে ক্লায়েন্ট সাইডে কাজ করতে চান, তাহলে জাভাস্ক্রিপ্টের প্রতি গুরুত্ব দিতে হবে। জাভা মূলত ব্যবহার হয় ব্যাকএন্ড প্রোগ্রামিংয়ের ক্ষেত্রে। উপরের একটি প্রশ্নের উত্তরে জাভার ব্যবহার উল্লেখ রয়েছে। এছাড়া জাভা কেনো শেখা উচিৎ বা কোথায় কোথায় ব্যবহার হয় তার জন্যে আগের একটি পোস্ট দেখে নিতে পারেন। লিংক: http://www.bazlur.com/2017/01/why-should-we-learn-java.html


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

Monday, February 13, 2017

এনাম (Enum)

জাভাতে এনাম (enum) একটি বিশেষ টাইপ। একটি নির্দিষ্ট সংখ্যক কনস্ট্যান্ট (Constant) তৈরি করতে এটি ব্যবহার করা হয়। যেমন, সপ্তাহের দিনের নাম (days of the week), বছরে মাসের নাম (month in the year), দিক (উত্তর, দক্ষিণ, পূর্ব, পশ্চিম) ইত্যাদি।
উদাহরণ,

public enum Day {
   SATURDAY,
   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY
}

উদাহরণটি Day নামে একটি এনাম তৈরি করা হয়ছে। এতে সাতটি কনস্ট্যান্ট রয়েছে। এনাম তৈরি করতে ক্লাস বা ইন্টারফেসের মতো একটি কিওয়ার্ড enum ব্যবহার করা হয়েছে।
এনাম সরাসরি ডট('.') অপারেটর ব্যবহার করে অ্যাকসেস করা যায় এবং ভ্যারিয়েবল হিসেবে ব্যবহার করা যায়। উদাহরণ,

Day day = Day.SATURDAY;

এনাম, if স্টেটমেন্টে ব্যবহার করা যায়। উদাহরণ,

 public class EnumExample {
   public void displayDay(Day day) {
      if (day == Day.SATURDAY) {
         System.out.println("Its saturday! Weekend!");
      } else if (day == Day.FRIDAY) {
         System.out.println("It's Friday!! Weekend!");
      } else {
         System.out.println("Weekday!");
      }
   }

   public static void main(String[] args) {
      EnumExample enumExample = new EnumExample();
      Day day = Day.SATURDAY;
      enumExample.displayDay(day);
   }
}

এনাম সুইচ স্টেটমেন্টে ব্যবহার করা যায়। উদাহরণ,

public void displayDay(Day day) {
   switch (day) {
      case SATURDAY:
         System.out.println("Its saturday! Weekend!");
         break;
      case FRIDAY:
         System.out.println("It's Friday!! Weekend!");
         break;
      default:
         System.out.println("Weekday!");
         break;
   }
}

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

Day[] values = Day.values();
for (Day day : values) {
   System.out.println(day);
}


আউটপুট,

SATURDAY
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY

এতে ফিল্ড, মেথড এবং কনস্ট্রাক্টর লেখা যায়। উদাহরণ,


public enum Level {
   HIGH(3),
   MEDIUM(2),
   LOW(1);

   private final int levelCode;

   Level(int levelCode) {
      this.levelCode = levelCode;
   }

   public int getLevelCode() {
      return this.levelCode;
   }
}


এছাড়াও এনাম সম্পর্কে বেশ কতগুলো তথ্য যা জেনে রাখা বিশেষ প্রয়োজন,
1. এনাম ডিক্লেয়ারেশন মূলত একটি ক্লাস যা কিনা java.lang.Enum ক্লাসকে এক্সটেন্ড করে। একে এক্সটেন্ড করা যায় না বা অন্য কোনো ক্লাসকে এটি এক্সটেন্ড করতে পারে না। তবে এনাম ইন্টারফেস ইমপ্লিমেন্ট করতে পারে।
2. এনাম টাইপ সেইফ। অর্থাৎ কোন এনাম ভ্যারিয়েবলে অন্য কোনো ভ্যালু অ্যাসাইন করা সম্ভবন না। উদাহরণ,

Day day = Day.MONDAY;
day = 4;

এখানে দ্বিতীয় লাইনটি বৈধ নয়।
3. এনামকে == অপারেটর ব্যবহার করে এবং equals() মেথড ব্যবহার করে দুই ভাবেই তুলনা করা যায়।
4. এনামকে নিউ (new) অপারেটর ব্যবহার করে এর ইনস্ট্যান্স তৈরি করা যাবে না।

Wednesday, January 25, 2017

জাভা প্রোগ্রামিং ল্যাংগুয়েজ তৈরির পেছনের গল্প

১৯৯৫ সালের ২৩ মে। ঝলমলে চমৎকার একটি দিন1। জন গেইজ (John Gage – ডিরেক্টর অব সান-মাইক্রোসিস্টেম) ও মার্ক অ্যান্ডারসেন (Marc Andreesen – নেটস্কেপের ভাইস প্রেসিডেন্ট ও সহপ্রতিষ্ঠাতা) ঘোষণা দেন যে, জাভা টেকনোলজি মোটেই কোনো উপকথা নয়, বরং এটিই বাস্তবতা এবং এটি নেটস্কেপ নেভিগেটর (Netscape Navigator) এর সঙ্গে সংযুক্ত হতে যাচ্ছে।

সে সময় জাভাতে কাজ করে এমন লোকের সংখ্যা ত্রিশেরও কম। তারা কখনোই চিন্তা করেনি তাদের এই টিম ভবিষ্যৎ পৃথিবীর প্রধানতম টেকনোলজি নির্ধারণ করতে যাচ্ছে। ২০০৪ সালের ৩ জানুয়ারি মার্স এক্সপ্লোরেশন রোভার (Mars Exploration Rover)2 মঙ্গল গ্রহের মাটিতে পা রাখে যার কন্ট্রোল সিস্টেম থেকে শুরু করে পৃথিবীর অধিকাংশ কনজুমার ইলেকট্রনিক্স, যেমন– কেবল সেট-টপ বক্স (STB), ভিসিআর (VCR), টোস্টার (Toaster), পিডিএ (PDA), স্মার্টফোনসহ প্রায় ১৫ বিলিয়ন ডিভাইস3, ১০০% ব্লু-রে ডিস্ক প্লেয়ার জাভা রান করে।

চলুন একটু পেছনের ইতিহাস জেনে নেই।

তখন সি++ (C++) এর একচ্ছত্রাধিপত্য।

সান মাইক্রোসিস্টেমস (Sun Microsystems, Inc.) মূলত হার্ডওয়্যার কোম্পানি। ১৯৭২ থেকে ১৯৯১ সালের এই সময়টাতে কম্পিউটার হার্ডওয়্যারের এক বিশাল বিপ্লব হয়। দ্রুত এবং উচ্চ ক্ষমতাসম্পন্ন সব হার্ডওয়্যার অল্প দামে পাওয়া যাচ্ছে এবং সেই সঙ্গে জটিল সব সফটওয়্যারের চাহিদা দ্রুতই বেড়ে চলছে। ১৯৭২ সালে ডেনিস রিচি (Dennis Ritchie)4 সি প্রোগ্রামিং ভাষা তৈরি করেন। যদিও তখনো প্রোগ্রামারদের মধ্যে এটি সব থেকে জনপ্রিয়, তবে প্রোগ্রামারদের মধ্যে সি-এর স্ট্রাকচার্ড প্রোগ্রামিং কিছুটা ক্লান্তিকর মনে হতে শুরু করেছে। এর ফলশ্রুতিতে বিয়ার্ন স্ট্রাউসট্রাপ (Bjarne Stroustrup)5১৯৭৯ সালে ডেভেলপ করেন সি++ (C++) যা কিনা মূলত সি (C) এবং এর সঙ্গে বাড়তি কিছু। এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ধারণাকে পরিচিত করে তোলে। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সুবিধা হচ্ছে একজন প্রোগ্রামার পুনর্ব্যবহারযোগ্য (reusable) কোড লিখতে পারে যেটা পরে অন্য কাজে পুনরায় ব্যবহার করা যায়।

১৯৯০ সাল।

সান মাইক্রাসিস্টেমসে সি++ এর আধিপত্যে সি-তে লেখা বিভিন্ন টুল এবং এপিআইগুলো প্রায় অচল হতে শুরু করেছে। প্যাট্রিক নটন (Patrick Naughton) যিনি সান মাইক্রোসিস্টেমের একজন ইঞ্জিনিয়ার, মোটামুটি হতাশ এবং এক ধরনের বিশ্রী পরিস্থিতির সম্মুখীন। ততদিনে স্টিভ জবস (Steve Jobs)6 অ্যাপল কম্পিউটার থেকে বিতাড়িত হয়ে নেক্সট কম্পিউটার ইনকরপোরেটেড (NeXT Computer Inc.) প্রতিষ্ঠা করে ফেলেছেন, যা পরবর্তীতে সফটওয়্যার ইন্ডাস্ট্রিতে বৈপ্লবিক পরিবর্তন আনতে যাচ্ছে এবং যার ফলশ্রুতিতে তৈরি হয়েছে আজকের ম্যাক অপারেটিং সিস্টেম (OS X)। তার এই নতুন প্রতিষ্ঠান নেক্সটস্টেপ (NeXTSTEP) নামে একটি অপারেটিং সিস্টেম তৈরি করে। এতে চমৎকার কিছু ব্যাপার ছিল। যার মধ্যে অবজেক্ট ওরিয়েন্টেড অ্যাপ্লিকেশন লেয়ারের ধারণাটি ছিল অসাধারণ। এতে অবজেক্ট ধরে ধরে কাস্টমাইজড সফটওয়্যার তৈরি করে ফেলা যায়। প্যাট্রিক নটন (Patrick Naughton) ইতিমধ্যে NeXT এর দিকে যাওয়ার জন্য মনস্থির করে ফেলেছেন। ঠিক তখনই একবার তাকে শেষ সুযোগ হিসেবে একটি অতি গোপন প্রজেক্টের (Stealth Project) অনুমোদন দেওয়া হয় যার কথা অন্য কেউ জানত না। কিছুদিন পরেই তার সঙ্গে যুক্ত হন জেমস গসলিং (James Gosling)7এবং মাইক শেরিডান (Mike Sheridan)। তখন এর নাম দেওয়া হয় গ্রিন প্রজেক্ট (Green Project)। সময়ের সঙ্গে সঙ্গে গ্রিন প্রজেক্টের দন্তোদ্গম হয়। তারা ধীরে ধীরে কম্পিউটার ছাড়াও আরও অন্যান্য ডিভাইস নিয়েও চিন্তাভাবনা শুরু করেন।

এর মধ্যে ১৩ জন কর্মীর এই গ্রিন প্রজেক্টের দল ক্যালিফোর্নিয়ার মেনলো পার্কের সেন্ড হিল রোডের একটি ছোট্ট অফিসে কাজ করতে থাকেন। এই দলকে পরবর্তীতে গ্রিন টিম নাম দেওয়া হয়। তাদের প্রধান উদ্দেশ্য সি++ (C++) এর একটি ভালো ভার্সন তৈরি করা যা হবে অনেক দ্রুতগামী এবং রেসপন্সিভ (responsive)। সেই সময়ে কম্পিউটার ছাড়াও কনজুমার ইলেকট্রনিক্স যেমন – পিডিএ, কেবল সেট-টপ বক্স ইত্যাদির চাহিদা বেশ বেড়ে গেছে। একদল ইঞ্জিনিয়ার এক সঙ্গে থাকলে যা হয়, তারা নানা রকম জিনিস নিয়ে চিন্তা করতে থাকে, নানা রকম আইডিয়া তৈরি হয়, তা থেকে প্রোটোটাইপ (Prototype) তৈরি করতে থাকে। এর মধ্যে জেমস গসলিং সি++ প্রোগ্রামিং ভাষায় বেশ কিছু বাড়তি জিনিস যুক্ত করতে থাকেন এবং কিছু কিছু জিনিস ফেলে দেন। তিনি এর নাম দেন সি++ ++ -- (C++ ++ --)। এখানে বাড়তি ++ মানে হচ্ছে নতুন জিনিস যোগ করা এবং - - মানে হচ্ছে কিছু জিনিস ফেলে দেওয়া।

জেমস গসলিংয়ের জানালা দিয়ে একটি ওক গাছ দেখা যায়। একদিন তিনি অফিস থেকে বের হয়ে ওই গাছটির নিচে দাঁড়ান এবং সঙ্গে সঙ্গে C++ ++ -- নাম পরিবর্তন করার সিন্ধান্ত নেন এবং নতুন নাম দেন ওক (Oak)।


একই সময় সানের ইঞ্জিনিয়াররা মিলে এম্বেডেড সিস্টেম (Embeded System) নিয়েও কাজ করতে থাকেন এবং এসময় তারা নানা রকম সমস্যার সম্মুখীন হন। এম্বেডেড সিস্টেমে মেমোরি কম থাকে, প্রসেসিং ক্ষমতাও কম থাকে। এই সিস্টেমে সি++ (যা কিনা কম্পিউটারের মতো বড় ফুটপ্রিন্টের হার্ডওয়্যারের জন্য ডিজাইন করা) চালাতে গিয়ে তারা অদ্ভুত অদ্ভুত সমস্যার সম্মুখীন হতে থাকেন। এইসব সমস্যার সমাধান করার জন্য গ্রিন টিম নানা রকম চিন্তাভাবনা করতে থাকে। এই সময়েই মানুষ পিডিএ, কেবল সেট-টপ বক্সগুলোর মরণদশা দেখতে শুরু করে। জেমস গসলিং যদিও ওক নিয়ে যথেষ্ট এগিয়েছেন কিন্তু এটি কোনোভাবেই এদেরকে সাহায্য করতে পারছিল না। সবার কাছে মনে হতে থাকে একমাত্র কোনো একটি অলৌকিক ঘটনাই পারে এই প্রজেক্ট সফল করতে। ঠিক তখনই সেই প্রতীক্ষিত প্রত্যাশা আলোর মুখ দেখা যায়। জেমস গসলিং আউট অব দ্য বক্স (out of the box)একটি যুগান্তকারী ধারণা নিয়ে আসেন। সেটি হলো ভার্চুয়াল মেশিন (Virtual Machine)। অর্থাৎ আমরা একটি কাল্পনিক মেশিনের জন্য কোড লিখব যা কম্পাইল হয়ে একটি অন্তর্বর্তীকালীন কোড (Intermediate Code) তৈরি করবে। জাভা ভার্চুয়াল মেশিন সেই অন্তর্বর্তীকালীন কোডকে রানটাইমে আসল ডিভাইসের জন্য প্রয়োজন অনুযায়ী মেশিন কোড তৈরি করবে।


ঠিক একই সময়েই ন্যাশনাল সেন্টার ফর সুপারকম্পিউটিং অ্যাপ্লিকেশনস (National Center for Supercomputing Applications – NCSA) একটি কমার্শিয়াল ওয়েব ব্রাউজার বের করে। তাদের টিম ইন্টারনেটের ভবিষ্যৎ নিয়ে ভাবতে শুরু করে। তারা একটি নতুন ধারণা নিয়ে আসে সেটি হলো, এক ধরনের ছোট ছোট প্রোগ্রাম যা ওয়েব ব্রাউজারের মধ্যে চলবে। তারা এর নাম দেয় অ্যাপলেট (Applet)। তারা অ্যাপলেটের জন্য কিছু মানদণ্ড (standard) ঠিক করে দেয়,
  1. এটি হতে হবে খুব ছোট, খুব সহজ ও সাধারণ, 
  2. এর স্ট্যান্ডার্ড এপিআই (Standard API) থাকতে হবে, 
  3. এটি হবে প্ল্যাটফর্ম ইনডিপেন্ডেন্ট (Platform Independent, অর্থাৎ সব ধরনের অপারেটিং সিস্টেমে চলবে), 
  4. একে ওয়েব ব্রাউজারে এম্বেড করা যাবে, 
  5. এর মাধ্যমে মাল্টিটাস্কিং (Multitasking) করা যাবে, 
  6. এতে হার্ডওয়ারের সরাসরি মেমোরি ম্যানিপুলেশন (Memory Manipulation) করা যাবে না, এবং 
  7. আউট-অব-দ্য-বক্স নেটওয়ার্ক প্রোগ্রামিং করা যাবে। 

তারা তখনকার সময়ের ইন্টারনেট বাবলকে (Internet bubble) উদ্দেশ্য করে পরবর্তী প্রজন্মের পণ্য (next generation product) তৈরি করতে চেয়েছিল। এই প্রজেক্টের কার্টুন নাম ছিল Duke (যা এখন আমরা জাভার মাস্কট হিসেবে চিনি)। পরবর্তীতে তারা সিদ্ধান্ত নেয় যে এম্বেডেড সিস্টেমের সমস্যার সমাধানটি তারা ওয়েব ব্রাউজারের ক্ষেত্রেও ব্যবহার করবে।

কিন্তু সমস্যা হচ্ছে এর কোনোকিছুই ঠিকঠাক মতো সি++ দিয়ে করা যাচ্ছিল না। সেই সময়ে ওয়েব ব্রাউজারে শুধুমাত্র স্ট্যাটিক পেইজে (Static Page) লেখা আর ছবি ছাড়া অন্য কিছু দেখাবার ব্যবস্থা ছিল না। এই অ্যাপলেট টেকনোলজি ব্যবহার করায় ব্রাউজার অ্যানিমেশন (Browser Animation) তৈরি করা যাবে। পেইজ হবে ইন্টারঅ্যাকটিভ (Interactive)। অ্যাপলেটের এই বৈশিষ্ট্যগুলো সবার নজর কাড়ে যা কিনা জাভা প্রোগ্রামিং ভাষার সফলতার মূল কারণ।

জেমস গসলিংয়ের এই ভার্চুয়াল মেশিনের সমাধানটি ছিল প্রকৃতপক্ষেই যুগান্তকারী (কেন যুগান্তকারী তা নিয়ে পরবর্তীতে এই বইয়ে আলোচনা করা হবে)। ইতিমধ্যে গ্রিন টিম ওকের প্রথম রিলিজ দেওয়ার প্রস্তুতি নেয়। ঠিক তখনই এক নতুন সমস্যার উদ্ভব হয়। আইনজীবীরা এসে জানায় যে, এর নাম ওক রাখা যাবে না। কারণ ইতিমধ্যেই এই নামটি ওক টেকনোলজিস (Oak Technologies) এর ট্রেডমার্ক। এর অর্থ এই যে, এর নাম পরিবর্তন করে অন্য নাম রাখতে হবে। শুরু হয় নানরকম চিন্তাভাবনার (brainstorming)। কিন্তু কোনোভাবেই একটি ভালো নাম নির্বাচন করা যাচ্ছিল না। অনেকেই অনেক ধরনের নাম উপস্থাপন করেন, যেমন- DNA, Silk, Ruby, yuck, Lyric, Pepper, NetProse, Neon, Java ইত্যাদি। এই সবগুলো নাম লিগ্যাল ডিপার্টমেন্টে সাবমিট করার পর মাত্র Java, DNA ও Silk এই তিনটি নাম ফিরে আসে যেগুলো কিনা ব্যবহার করা যাবে। নাম নিয়ে ঘণ্টার পর ঘণ্টা মিটিং চলতে থাকে। এর মধ্যে ক্রিস ওয়ার্থ (Chris Warth), জাভা (Java) নামটি ব্যবহার করার প্রস্তাব করেন, কারণ তখন তার হাতে ছিল এক কাপ গরম Peet's Java (কফি)8। শেষপর্যন্ত অনেক চিন্তাভাবনার পর এর নাম ঠিক করা হয় জাভা। কারণ একমাত্র এই নামেই সব থেকে ইতিবাচক প্রতিক্রিয়া পাওয়া যাচ্ছিল। তাছাড়া কফি পান করার পর সবারই মন চনমনে হয়ে যায়।

জাভা এমন একটি প্রোগ্রামিং ভাষা যা কিনা তখন সবার মনকেই চাঙা করে দিয়েছিল।

১৯৯৫ সালের মে মাসে জাভার প্রথম পাবলিক ভার্সন রিলিজ হয়।

এর পরের ইতিহাস আমরা সবাই জানি। জাভা হচ্ছে পৃথিবী নামক গ্রহের সবচেয়ে সফল এবং জনপ্রিয় প্রোগ্রামিংয়ের ভাষা।




পাদটীকা
1 দিনটি চমৎকার ছিল কিনা এ বিষয়ে আমার ধারণা নেই, তবে ধরে নিচ্ছি এটি একটি চমৎকার দিন ছিল।
2 http://soa.sys-con.com/node/39220/mobile
3 https://go.java/index.html
4 Dennis Ritchie (September 9, 1941 – October 12, 2011) আমেরিকান কম্পিউটার বিজ্ঞানী ও সি প্রোগ্রামিং ভাষা এবং Unix অপারেটিং সিস্টেমের প্রণেতা।
5 Bjarne Stroustrup, ডেনমার্কের কম্পিউটার বিজ্ঞানী, সি++ প্রোগ্রামিং ভাষার প্রণেতা।
6 Steven Paul "Steve" Jobs – বিখ্যাত আইফোন প্রস্তুতকারী কোম্পানি অ্যাপলের সহপ্রতিষ্ঠাতা, চেয়ারম্যান এবং প্রধান নির্বাহী কর্মকর্তা (CEO)
7 James Gosling – জাভা প্রোগ্রামিং ভাষার স্রষ্টা (Father)।
8 http://www.javaworld.com/article/2077265/core-java/so-why-did-they-decide-to-call-it-java-.html

Thursday, November 3, 2016

জাভা ইন্টারফেস এর ক্ষেত্রে multiple inheritance সাপোর্ট করলেও ক্লাসের ক্ষেত্রে কেনো করে না ?

জাভা প্রোগ্রামিং ল্যাংগুয়েজের ডিজাইনাররা কয়েকটি গুরুত্বপূর্ণ বিষয় মাথায় রেখে এই ল্যাংগুয়েজকে ডিজাইন করে। এগুলো হলো-
  1. এটি হতে হবে খুবই সিম্পল, অবজেক্ট ওরিয়েন্টেড এবং পরিচিত, অর্থাৎ যারা তখন সি বা সি++ জানতো তারা যাতে করে সহজেই বুঝতে পারে।
  2. এটিকে অবশ্যই অনেক শক্তসমর্থ এবং নিরাপদ (robust and secure) হতে হবে।
  3. এটি যেকোন অপারেটিং সিস্টেমে চলবে।
  4. এর পারফর্মেন্স অনেক ভাল হতে হবে ।
  5. এটি ইন্টারপ্রেটেড, থ্রেডেড এবং ডাইনামিক হতে হবে। (এখানে বলে রাখি, জাভা যদিও কম্পাইল্ড ল্যাংগুয়েজ, কিন্তু জাভা ভার্চুয়াল মেশিন মূলত বাইটকোড ইন্টারপ্রেট করে আর জেভিএম একটা ডাইনামিক মেশিন)।
এই কয়কেটা উদ্দেশ্যের সাথে আরেকটি গুরুত্বপূর্ণ জিনিস হলো- এর ল্যাংগুয়েজ ফিচার খুব অল্প হতে হবে যাতে একজন প্রোগ্রামার খুব সহজেই মনে রাখতে পারে। যেসব ফিচার খুব ঝামেলাযুক্ত এবং আসলে তেমন প্রয়োজন নেই খুবএকটা সেগুলোকে তারা বাদ দিয়ে ডিজাইন করেছে। যেমন- অপারেটর ওভারলোডিং, মাল্টিপল ইনহেরিটেন্স। এগুলো সুবিধার চেয়ে প্রোগ্রামারদের অসুবিধার কারণ বেশি তৈরি করে।
মাল্টিপল ইনহেরিটেন্সের ক্ষেত্রে একটি বড় সমস্যা হলো ডাইমন্ড সমস্যা। একটি উদাহরণ দেওয়া যাক- মনে কর, একটি ক্লাস A, একে B ও C এক্সটেন্ড করে। আবার আরেকটি ক্লাস D যা কিনা B ও C কে এক্সটেন্ড করে। এখন ধরো, যদি A এর কোনো একটি মেথডকে B ও C দুটিই ওভারাইড করে। এখন যদি D থেকে সেই মেথডটি কল করতে চাও, তাহলে সেটি কোন ক্লাসের মেথডকে কল করবে ? B না C ? সমস্যাটি নিশ্চয় বোঝা যাচ্ছে? 
ইন্টারফেসের ক্ষেত্রে এই সমস্যা হওয়ার কোন উপায় নেই, কারণ প্রত্যেকটি ক্লাস যেহেতু মেথডগুলো ইম্প্লিমেন্ট করবে, তাই সবাই আসলে নিজের মেথডকেই কল করবে।
জাভা ডিজাইনাররা এরকম সমস্যার মধ্য দিয়ে যেতে চায় নি। তাই জাভাতে মাল্টিপল ইনহেরিটেন্স নেই।

Ref: http://programabad.com/questions/5613/multiple-inheritence/5614