220 likes | 474 Views
Advanced Class Design in Java Java Packages Week #6 Jarungjit Parnjai. Object Oriented Programming. Modularity. Modularity ก่อใ ห้เกิดพื้นฐานของการที่โปรแกรมถูกพัฒนา และผลลัพธ์ของการบำรุงรักษา software high cohesion : ความสัมพันธ์กันอย่างใกล้ชิดระหว่าง หน่วย ( unit) ภายใน software module
E N D
Advanced Class Design in JavaJava PackagesWeek #6Jarungjit Parnjai Object Oriented Programming
Modularity • Modularity ก่อให้เกิดพื้นฐานของการที่โปรแกรมถูกพัฒนา และผลลัพธ์ของการบำรุงรักษา software • high cohesion : ความสัมพันธ์กันอย่างใกล้ชิดระหว่าง หน่วย (unit) ภายใน software module • low coupling : ความขึ้นตรงต่อกันและกัน แบบไม่ใกล้ชิดระหว่า software modules ที่แตกต่างกัน
Modularity • หน่วย (Unit) ของ software module • method จัดเป็น programming unit ที่เล็กที่สุด • class เป็น unit ที่ใหญ่ขึ้นถัดมา methods ที่เกี่ยวเนื่องสัมพันธ์กัน จะถูกจัดไว้ใน class definition เดียวกัน • package ใน Java ก่อให้เกิดที่บรรจุ software สำหรับคลาสต่างๆ ที่มีหน้าที่การทำงานที่เกี่ยวข้องกัน
geometry.Point same package geometry.Circle Packages in Java • package ถูกประกาศโดยใช้คำเฉพาะ “package” คลาสที่เกี่ยวเนื่องสัมพันธ์ถูกจัดไว้ใน package เดียวกัน • คลาส Point ถูกกำหนดไว้ใน “Point.java” • คลาส Circle ถูกกำหนดไว้ใน Circle.java • ถ้าไม่มีคำเฉพาะ “package” คลาสภายใต้ directory เดียวกันจะจัดไว้ใน package เดียวกันที่ไม่มีการตั้งชื่อ packagegeometry; public class Point { … … } packagegeometry; public class Circle { … … }
The “package” Statement • การประกาศ “package” ในภาษาจาวา สามารถทำได้ดังนี้ package package_name1[.package_name2]; • โดยมีเงื่อนไขดังนี้ • ประกาศไว้ที่ตำแหน่งเริ่มต้นของไฟล์เท่านั้น • ประกาศได้เพียง 1 package ต่อ 1 source file • ตัวอย่าง “Bank.java” และ “Customer.java” package banking; public class Bank { : } package banking; public class Customer { : }
Software Package • ช่วยในการจัดการ Software ขนาดใหญ่ โดยรวมกลุ่มของคลาส ไว้ใน “Package”
คลาส geometry.Point จะถูกอ้างอิงด้วย Point คลาส geometry.Circle จะถูก import เข้ามาด้วย Class Reference in Package • คลาสภายใน package ที่ถูกตั้งชื่อไว้ สามารถอ้างอิงได้ 2 แบบ: • ใช้ชื่อเต็มของ คลาส package-name.ClassName; เช่น geometry.Point; หรือ banking.Bank; • import คลาส และใช้เฉพาะชื่อคลาส • import คลาสเดียวภายในคลาสที่ระบุ import package-name.ClassName; เช่น import geometry.Point; • import ทุกคลาสที่อยู่ภายใน package import package-name.*; เช่น import geometry.*;
มองเห็นเฉพาะภายใน package “geometry” Import ทุกคลาสภายใต้ package “geometry” แต่ใช้ งานเฉพาะคลาส Point Visibility in Package • นอก Package มองเห็นเฉพาะคลาสที่ประกาศเป็น public • by default มองเห็นคลาสที่ไม่ได้ประกาศ modifier เฉพาะภายในpackage เช่น • คลาส Point และ Line ถูกกำหนดไว้ใน “Point.java” • คลาส DemoClient ถูกกำหนดไว้ใน “DemoClient.java” package geometry; public class Point { … … } class Line{ … … } import geometry.*; public class DemoClient { … … }
คลาสชื่อเดียวกัน แต่อยู่ต่างคลาส อ้างอิงคลาส Point ที่ถูกประกาศ ไว้ภายใต้ package geometry Preventing Name Collision • packages จัดเป็นเครื่องมือที่ใช้ในการแบ่งส่วน name space และป้องกัน preventing name collisions • คลาสใน packages ต่างกันสามารถมีชื่อเดียวกันได้ • คลาสเหล่านั้นสามารถรวมไว้ในไฟล์เดียวกันโดยไม่ก่อให้เกิด name collision • หรือ packagespace; public class Point { … … } geometry.Point gPoint = new geometry.Point( … … ) space.Point sPoint = new space.Point( … … ) import geometry.Point; gPoint = new Point( … … ) space.Point sPoint = new space.Point( … … )
Directory Structure • source และ class จะต้องจัดไว้ใน directory ที่โครงสร้าง directory ตรงกับโครงสร้างของ package • คลาส Foo ถูกกำหนดไว้ใน source file ที่ชื่อ Foo.java • Foo.java ถูกเก็บไว้ใน • compile • execute โปรแกรม package package1.package2; public class Foo { … … } X:\myjava\oop\package1\package2\Foo.java X:\myjava\oop\package1\package2 > javac Foo.java X:\myjava\oop>java package1.package2.Foo
CLASSPATH • compiler และ interpreter จะค้นหา CLASSPATH สำหรับ class files ที่ต้องการใช้ • คลาส Foo ถูกกำหนดไว้ในไฟล์ Foo.java • Foo.class ถูกเก็บไว้ใน • กำหนด class path • execute โปรแกรม packagepackage1.package2; public class Foo { … … } X:\myjava\oop\package1\package2\Foo.class X:\anywhere > set CLASSPATH=.;X:\myjava\oop X:\anywhere >java package1.package2.Foo
Java API Packages • java.langประกอบด้วย Java classes ที่จำเป็นสำหรับการประมวลผล Java programs (import ได้โดยไม่ต้องประกาศ) • java.ioประกอบด้วย Java classes ที่ใช้สำหรับการจัดการ input และ output • java.netประกอบด้วย Java classes ที่เกี่ยวกับ networking • java.utilประกอบด้วย Java classes สำหรับหน้าที่การทำงานทั่วไปเช่น list collections หรือ data representation • java.awtประกอบด้วย Java classes ที่ใช้เป็นAbstract Windowing Toolkit • java.appletประกอบด้วย Java classes ที่ใช้ในการสร้าง applet
Example :TestBanking public class TestBanking { public static void main(String[ ] args) { Banking.Bank bank; bank = new Banking.Bank( ); Banking.Customer customer; bank.addCustomer("Julia", "Roberts"); customer = bank.getCustomer(0); customer.addAccount(new BankAccount(500.00)); customer.addAccount(new BankAccount(200.00)); bank.addCustomer("David", "Beckham"); customer = bank.getCustomer(1); customer.addAccount(new BankAccount(350.00)); } }
Example : TestBanking import Banking.*; public class TestBanking { public static void main(String[ ] args) { Bank bank; bank = new Bank( ); Customer customer; bank.addCustomer("Julia", "Roberts"); customer = bank.getCustomer(0); customer.addAccount(new BankAccount(500.00)); customer.addAccount(new BankAccount(200.00)); bank.addCustomer("David", "Beckham"); customer = bank.getCustomer(1); customer.addAccount(new BankAccount(350.00)); } }
Directory Layout and Package • Source Code ถูกเก็บไว้อยู่ใน directory ที่ตั้งชื่อตามชื่อ package • bytecode ที่ได้จากการ compile Source Code ถูกเก็บไว้ใน directory อื่น
ประกาศ package Example : Stack package stack1; public class Stack { private Item[ ] contents; private int top; public Stack( ) { contents = new Item[10]; top = -1; } // End default constructor public Stack(int aSize) { contents = new Item[aSize]; top = -1; } // End second constructor … … } // End Stack class • Case Study : คลาส Stack1 Stack ถูก implementโดยใช้ array Item IntItem FloatItem
Example : Stack public Item pop( ) { if (empty( )) { System.err.println("stack underflow"); return(new intItem(0)); } else { Item x = contents[top--]; return(x); } } // End pop publicvoid push(Item x) { if (full( )) System.err.println("stack overflow"); else { contents[++top] = x; System.out.println("Pushed "+x.getValue( )+" into Stack"); } } // End push
Example : Stack public int size( ) { return(top+1); } // End size public boolean empty( ) { return(size( ) == 0); } // End empty public boolean full( ) { return(size( ) == contents.length); } // End full
รับ input จาก Command lineargument กฎ ของ Subtype Return ค่า instance ของ item Example : StackDemoClient import stack1.*; public class StackDemoClient1 { public static void main(String[ ] argv) { int i, numberOfItem; numberOfItem = Integer.parseInt(argv[0]); Stack s = new Stack( ); for (i = 0; i < numberOfItem/2; i++) s.push(new IntItem(i)); for (i = numberOfItem/2; i < numberOfItem; i++) s.push(new FloatItem((float) i)); for (i = numberOfItem; i > 0; i--) System.out.println("Item popped = " + (s.pop()).getValue()); } // End main } // End StackDemoClient1 z
Summary • Java Packages