iT邦幫忙

1

{CMoney戰鬥營} 的第一週 #物件導向

前言

在二十多歲的最後一年,決定再讓自己任性一回,開始在 CMoney 參加工程師培訓營,給自己半年,花費全部的心力在"寫程式"這件我一直都很有興趣的事情上。理工背景出生的我對於程式並不陌生,但多半是硬刻出一個可以運作的工具,一直很想要利用上班之餘的時間多深入些什麼,零碎的時間和人性的懶惰也常常讓這事拖延。

從零開始學程式,但我們的戰鬥其實是從物件導向開始!第一週的複習週一點也不手軟,很驚喜的發現同學們也都卯足了全力,幾位程式小白們透過自學也都如火如荼的跟上進度。有一群抱有同樣熱情的夥伴們一起努力,實在很幸運,那就開始記錄這一週忙碌的複習工程吧!

為了物件導向, 我們練習蓋了一座圖書館


題目

圖書館中有數個書架,書架上有數本書,書本有許多出版資訊...

主程式

  1. 新增書櫃
  2. 新增書本
  3. 查詢指定分類的所有書籍
  4. 修改書籍資訊
  5. 指定書櫃編號和書名,修改書本資訊
  6. 印出所有書籍

類別1: 圖書館(Library)

  • 屬性: 書櫃(BookShelf[]), 書櫃總數(int)
  • 方法:
    • 新增書櫃: 指定書櫃分類, 存書量上限
    • 尋找書櫃: 指定書櫃編號
    • 印出所有書籍: 指定書櫃分類
    • 新增書籍:指定書櫃分類, 查找相同分類的書櫃, 按順序存放在尚有空間的書櫃中, 若書櫃全滿則回傳書櫃全滿

類別2: 書櫃(BookShelf)

  • 屬性: 編號(int), 分類(String), 存書上限(int), 書總數(int), 書(Book[])
  • 方法:
    • 新增書籍: 指定書名, 作者, 出版日
    • 尋找書籍: 指定書名
    • 修改書籍: 指定書名, 查詢書籍後讓使用者修改書籍資訊

類別3: 書(Book)

  • 屬性: 書名(String), 作者(String), 出版日期(Date)

類別4: 日期(Date)

  • 屬性: 年(int), 月(int), 日(int)
  • 方法:
    • 建構子(Book)
    • 設定年/月/日

軟工筆記

就這樣,我們在浩瀚的書海裡,由淺入深,迷途忘返...

類別4: 日期(Date)

  • java的命名習慣:
    • 變數/方法: nameNameName
    • 類別: NameNameName
  • 封裝技巧: 把屬性設為pivate,以getter/ setter 存取,已利後續調整存取條件限制
  • 強制轉型(整數->字串): ""+(int)
    public class Date{
        private int year;
        private int month;
        private int date;
        public Date(int year, int month, int date){
            setYear(year);
            setMonth(month);
            setDate(date);
        }
        public int getYear(){
            return year;
        }
        public void setYear(int year){
            this.year = year;
        }
        public String toString(){
            int i = getYear()*10000 + getMonth()*100+ getDate();
            return ""+i;
        }
      
        public int getMonth(){...}
        public void setMonth(int month){...}
        public int getDate(){...}
        public void setDate(int date){...}
        
    }

類別3: 書(Book)

  • 使用 String.format() 將字串格式化
    public class Book{
        private String bookName;
        private Date publishDate;
        private String writer;
        
        public Book(String name, Date date, String writer){...}
        public String getBookName(){...}
        public void setBookName(String bookname){...}
        ...
        
        public void bookString(){
            String info = Stirng.format("%-15s\t%-10s\t%s",
            getBookName(),getWriter(),getDate().toString);
            return info;
        }
    }

類別2: 書櫃(BookShelf)

  • 新增書籍:
    • 引數設定為Book 類別較為理想,將不屬於BookShelf 該做的是撇除在BookShelf 的類別中,如果未來Book類別的屬性有變化時才不會影響到BookShelf
    • 在void 方法中加入return,可以作為中斷點
  • 尋找書籍: 暫時使用容易實作的循序搜尋,字串的相等必須使用equals().否則會比較記憶體位置
  • 修改書籍: 將新的書名等需要使用者輸入的功能留BookShelf之外
    public class BookShelf{
        private int serial;
        private Sting index;
        private int bookMax;
        private int bookCount;
        private Book[] books;
         
        public BookShelf(int serial, String index, int bookMax){
            setSerial(serial);
            ...
            bookCount = 0;
            books = new Book[bookMax];
        }
        public int getSerial(){...}
        public void setSerial(int serial){...}
        ...
        
        public void addBook(Book book){
            if(bookMax == bookCount){
                return;
            }
            books[count++] = book;  
        }      
        public Book findByName(String bookName){
            for(int i = 0; i < count; i++){
                if(books[i].getBookName.equals(bookName)){
                return books[i];
                }
            }
            return null;
        }
        public void modifyByName(String bookName,
        String newBookName, String newWriter, Date newDate){
            Book book = findByName(name);
            if(book != null){
                book.setBookName(newBookName);
                ...
                return;
            }
            return;
        }
        public String bookShelfString(){
            ...
        }
    }

類別1: 圖書館(Library)

  • 書櫃數量: 未知長度的arrary
    • 基礎記憶體管理技巧: 不夠用時在倍增, 在數量少時頻繁運作, 數量大時減緩運作
    • 矩陣複製: 初新者應學習逐一複製資訊
     public class Lirary{
         private BookShelf[] bookShelfs;
         private int bsCount;
     
         public BookShelf[] getBookShelfs(){...}
         ...
         
         public Library(){
             bookShelfs = new BookShelf[2];
             bsCount = 0;
         }
         private void doubleBookShelfs(BookShelf[] arr){
             BookShelf[] newArr = new Bookshelf[arr.length *2];
             for(int i = 0; i < arr.length; i++){
                 newArr[i] = arr[i];
             }
             arr = newArr;
         }
         public void addBookShelf(BookShelf bookshelf){
             if(bsCount == bookshelfs.length){
                 doubleBookShelfs(bookshelfs);
             }
             bookshelfs[bsCount++] = bookshelf;
         }
     }

  • 尋找書櫃: 循序搜尋,回傳一個找到的[書櫃們],也就是另一個Library,因為裡頭 BookShelf 指向的 Book 相同,改變其中的資訊兩個圖書館的藏書都會修改!
   public class Lirary{
       public Library findByIndex(String index){
           Lirary found = new Lirary()
           for(int i = 0; i < bsCount; i++)
               if(bookShelfs[i].getIndex().equals(index)){
                   found.addBookShelf(bookShelfs[i]);
               }
           }
           return found;
       }
       public void addBook(String index, Book book){
           Lirary found = findByIndex(index);
           if(found.getBsCount() != 0){
               for(int i = 0; i <= found.getBsCount(); i++){
                   if(found.getBookShelfs()[i].bookCount < 
                       found.getBookShelfs()[i].bookMax){
                       found.getBookShelfs()[i].addBook(book);
                       return;
                   }
               }
               System.out.println("書櫃已滿");
               return;
           }
           System.out.println("輸入錯誤");
       }
   }

尚未有邦友留言

立即登入留言