Sunday, May 23, 2010

OOP සඳහා අභ්‍යාස II කොටස

අපි කලින් පාඩමෙන් ස‍රල OOP සඳහා උදාහ‍රණ දෙකක් සාකච්ඡා කලා. අපි මේ පාඩමේදී බලමු මදක් සංකීර්ණ OOP examples කිහිපයක්. අපි මෙතෙක් උගත් Object Oriented සංකල්ප වලින් පමණක් උදාහ‍රණ සපයා ඇති ඇතිබව සලකන්න. අපි ඉදිරියේදී ජාවාහි තවත් වැදගත් Object Oriented සංකල්ප සාකච්ඡා ක‍රමු. එහිදී ඒවාට අදාල උදාහ‍රණ සුදුසු ප‍රිදි ඉදිරිපත් කෙරෙනු ඇත.
අපි මෙහිදී objects අත‍ර සම්බන්දතාවයක් පෙන්විය හැකි උදාහ‍රණයක් සලකා බලමු. objects ලෙස Point හා Line (ලක්ෂ්‍යයක් හා සරල රේඛාවක්) ගනිමු. මෙහිදී අපි එක එකක් class සඳහා වෙන වෙනම java file ලියා තිබෙනවා. පාඩම අවසානයේ එම මූලාශ්‍ර කේත අමුණා තිබෙනවා.
Point.java
/**
 *Class Name : Point
 *Author     : Kanishka Dilshan
 *Bolg       : http://javaxclass.blogspot.com
 *Purpose    : Demonstrate relationships between objects
 */
public class Point {
 private int x,y;
 
 public Point(int x,int y){
  this.x=x;
  this.y=y;
 }
 
 public void setX(int x){
  this.x=x;
 }
 
 public void setY(int y){
  this.y=y;
 }
 
 public int getX(){
  return x;
 }
 
 public int getY(){
  return y;
 }
 
 public double distance(){
  //calculate and return distance from the origin
  double dis=Math.sqrt(Math.sqrt(Math.pow(x,2)+Math.pow(y,2)));
  return dis;
 }
 
}
දැන් ඔබට Point class එකේ ජාවා කේතය කියවා අවබෝධ ක‍රගැනීමට හැකිවිය යුතුය. ගැටලුවක් ඇත්නම් පෙර OOP පාඩම් නැවත කියවා බලන්න.Math.pow() හා Math.sqrt() යනු ජාවාහි inbuilt methods ය. pow() method එක මගින් යම් සංඛ්‍යාවක බලයක්ද sqrt() method එක මගින් යම් සංඛ්‍යාවක වර්ගමූලයද ලබාදේ.
දැන් අපි අපි ඉහත ලියන ලද Point class එක සම්බන්ද ක‍රගෙන Line (ස‍රල රේඛාවක්) සඳහා class එකක් ලියමු. source code එක කියවීමේදී statements වලට අදාලව යොදා ඇති comments ද කියවන්න. එමගින්ද අදාල කොටස ගැන හොඳ අවබෝධයක් ලබාගත හැකිවේවි.
Line.java

/**
 *Class Name : Line
 *Author     : Kanishka Dilshan
 *Bolg       : http://javaxclass.blogspot.com
 *Purpose    : Demonstrate relationships between objects
 */
public class Line {
 private Point p1,p2;
 /**
  *p1 and p2 are Point objects
  *we have already created the Point class
  */
  public Line(Point p1,Point p2){
  this.p1=p1;
  this.p2=p2;
  }
  
  public double getLength(){
  int x1=p1.getX();
  int x2=p2.getX();
  int y1=p1.getY();
  int y2=p2.getY();
  double len=Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2));
  return len;
  }
  
  public void showDetails(){
  System.out.println("x1 : " + p1.getX() + " y1 : " + p1.getY());
  System.out.println("x2 : " + p2.getX() + " y2 : " + p2.getY());
  System.out.println("----------------------------------------");
  }
 
}
ඔබ දකින්නට ඇති Line class එකේ 8 වන පේලියේදී අපි p1 හා p2 ලෙසින් Point object 2ක් සාදාගෙන තිබෙනවා. එම Point type එක වනුයේ අපි ඉහතින් සකස්ක‍ර ගත් Point class එකයි.
අපි Line class එකේ constructor එකේදී (13පේලිය)
Point parameters 2ක් ගෙන තිබෙනවා.අපි දැන් ඉහත class 2ම යෙදෙන ප‍රිදි ජාවා වැඩසටහනක් ලියමු.
/**
 *Class Name : Line
 *Author     : Kanishka Dilshan
 *Bolg       : http://javaxclass.blogspot.com
 *Purpose    : Demonstrate howto use above classes
 */
public class OOPDemo {
 public static void main(String args[]){
  //create 2 Point objects (p1 and p2)
  Point pnt1=new Point(3,4);
  Point pnt2=new Point(-2,7);
  System.out.println("x position of p1    : " + pnt1.getX());
  System.out.println("y position of p1    : " + pnt1.getY());
  System.out.println("distance frm Origin : " + pnt1.distance());
  System.out.println("----------------------------------------");
  
  //creating a Line object;
  Line ln1=new Line(pnt1,pnt2);
  //show details of ln1
  System.out.println("Details of the line object");
  ln1.showDetails();
  double lineLen=ln1.getLength();
  System.out.println("length of line : " + lineLen);
 }
}
Output :
අපි ඉහත වැඩසටහනේ main method එකේදී සිදුක‍ර ඇත්තේ අප විසින් ලියූ Point class එක සහ Line class එක භාවිතා ක‍ර objects සෑදීමයි. pnt1 හා pnt2 ලෙසින් Point object 2ක් සාදා ඉන් pnt1 එකෙහි details console එකෙහි print ක‍ර එම pnt1 හා pnt2 objects arguments ලෙස භාවිතා ක‍රමින් Line object එක සාදා තිබෙන බව ඔබට වැටහෙනවා ඇති.
ඉහත Point හා Line class 2 යොදාගනිමින් සාදා ඇති පහත ඇප්ලටය භාවිතා ක‍රමින් එම objects වල හැසිරීම ප‍රීක්ෂා ක‍ර බලන්න. එම Java Applet එකෙහි source code එකද මම පහත ඉදිරිපත් ක‍ර ඇති link එකෙන් download ක‍රගන්න පුලුවන්.

ජාවා ඇප්ලට් ගැන අපි ඉදිරි පාඩම් පෙලකින් දීර්ඝව සාකච්ඡා ක‍රමු. මෙහිදී අප උගත් දෑ ආදර්ශනය කිරීමට පමණක් පහත ජාවා applet එක ලියා ඇති බව සලකන්න

මෙම පාඩමේ ඉදිරිපත් ක‍ර ඇති මූලාශ්‍ර කේත භාගත ක‍රගැනීමට පහත link එක භාවිතා ක‍රන්න.

ඉහත Java Applet එකෙහි source code එක download ක‍රගැනීමට පහත link එක භාවිතා ක‍රන්න.

6 comments:

  1. ඔබගේ උත්සාහය ඉතා හොඳයි. දිගටම කරගෙන යන්න.

    මට පුංචි ගැටළුවක් තියෙනවා.
    public static boolean test(int[] p) {
    int i;
    for (i= p.length-1; i-- > 0 && p[i] > p[i+1];);
    System.out.print(p[i]);
    }

    මේ ආකාරයෙන් ලියන එකක් වැඩ කරන ආකාරය පැහැදිලි කළ හැකිද?

    ReplyDelete
  2. මේ code එකේ තිබෙන function එකේ return statement එක නැහැ ඒක දෝශයක්.

    parameter එකක් විධියට pass කරන array එකේ අග ඉඳලා තමයි values access කරගෙන යන්නේ.
    එහිදී හමුවන i+1 element එක i වන element එකට වඩා අඩුවුව හොත් loop එක නවතිනවා. ඒ කියන්නේ array index එක අඩුවන පැත්තට බැලුවොත් මුලින්ම හමුවෙන විශාලතම සංඛ්‍යාවට පසුව ඇති සංඛ්‍යාව console එකෙහි print කිරීම සිදුකරනවා.
    array එකේ අගයන් ලෙස 34,19,56,1980,110,4 ලබා දුන්නොත් console එකේ 56 ලෙස මුද්‍රණය වනවා.
    නමුත් මෙහි අපි දෙන ලද අගයන් අවරෝහණ පිලිවෙලට තිබුනොත් උදා : 12,4,3,1 මෙම කේතය run time exception එකක් ලබාදෙනවා. මෙයට හේතුව තමයි comparison එකේ මුලින් යෙදෙන්නෙ i-- නිසා p[i] execute වීමේදී i ට -1 ලැබීම.

    ඇත්තටම මෙය මීට වඩා ඉතාම සරලව ලියන්න පුලුවන් අර කිව්ව runtime exception එකත් නොඑන විධියට.

    මට හිතෙන්නෙ මේක obfuscated bytecode එකක් decompile කරලා ලබාගත්ත source එකක කොටසක් වෙන්න ඕන.

    ReplyDelete
  3. Point.java code1

    Math.sqrt(Math.sqrt(Math.pow(x,2)+Math.pow(y,2)));

    line1 printing mistake1k

    Math.sqrt1k wadi neda?
    Math.sqrt(Math.pow(x,2)+Math.pow(y,2));

    mema neda enna ona?

    ReplyDelete
  4. ස්තුතියි හැකි ඉක්මනින් එය නිවැරදි කරන්නම්.

    ReplyDelete
  5. මුලින්ම ස්තුති කියන්න ඕනේ, බ්ලොග් එක ගොඩක් හොදයි. ජාවා වලට මුලික දැනුම එකතු කරගන්න හිතන් ඉන්නේ මම මේ බ්ලොග් එකෙන්,

    මට පොඩි ප්‍රශ්නයක් තියෙනවා.
    point class එකේ constructor එකේ parameters දෙකක් තියෙනවා x,y කියල.
    නමුත් line class එකේ objects creates කරන විට constructor call කරලා තියෙනවා කියල මට පෙන්නේ නෑ. main function එකේ නම් constructor call කරලා තියෙන විදිය පැහැදිලියි.

    ReplyDelete
  6. @Anonymous
    ඔබගේ ගැටලුව ටිකක් අපැහැදිලියි. මට වැටහුන ආකාරයට පිලිතුරු දෙන්නම්.

    ඉහත උදාහරණයේ Line class එක තුල කිසිදු තැනක object create කිරීමක් සිදුවෙලා නැහැ. Main method එකේ හදපු object තමයි Line එක construct වෙද්දි පාස් කරල තියෙන්නෙ.

    ReplyDelete