จั่วหัวภาษาไทยให้งงเล่นอีกแล้ว วันนี้จะพูดถึงเรื่องของ Business Logic นะครับ

ความหมายของคำว่า Business Logic ก็คือ บรรดาลอจิกทั้งหลายที่เกี่ยวข้องกับการทำธุรกรรมต่าง ๆ ในระบบของเรา โดยคำนี้เรามักจะใช้กับโปรแกรมที่สร้างขึ้นมาสำหรับงานด้านธุรกิจต่าง ๆ เช่น พวกระบบจัดเก็บข้อมูลของธนาคาร ที่ใช้กันตามแบงค์นั่นล่ะครับ Business Logic นั้นก็จะรวมตั้งแต่ การตรวจสอบข้อมูล (Validation) การประมวลข้อมูลเพื่อประกอบการตัดสินใจ การสร้างค่าปริยาย (Default) และอื่น ๆ ที่เกี่ยวข้อง ทั้งนี้จะไม่เกี่ยวกับการแสดงผลข้อมูล และการจัดเก็บข้อมูลครับ

ถ้าเป็นใน Model-View-Controller (MVC) ส่วนของ Business Logic จะเป็นส่วนของ Controller ครับ

ในส่วนของ Business Logic เท่าที่ผมพอจะรู้นะ ในปัจจุบันจะมีส่วนประกอบหลัก ๆ ก็คือ Business Object กับ Business Process โดย Business Object ก็คือวัตถุที่เกี่ยวข้องกับการทำธุรกรรมต่าง ๆ เช่นวัตถุที่แทนข้อมูลบัญชีลูกค้า วัตถุที่เก็บข้อมูลการซื้อขาย เป็นต้น ส่วน Business Process นั้นหมายถึงการทำธุรกรรมต่าง ๆ เช่นการซื้อขาย การเรียกดูข้อมูลย้อนหลัง การเรียกดูและเปลี่ยนแปลงข้อมูลที่อยู่ลูกค้า เป็นต้น

คงมีคนสงสัย อ้าวไหนบอกว่ามันเป็นส่วนของ Controller ไง ไหง BO ถึงเป็นวัตถุเรียกเก็บข้อมูลขึ้นมาล่ะ คืองี้ครับ เจ้า Business Object เนี่ยมันจะมีส่วนของการตรวจสอบข้อมูล การประมวลผลข้อมูลประกอบการตัดสินใจ การสร้างค่าปริยาย อะไรทำนองนี้เอาไว้ด้วย เช่น สมมติว่าผมมี BO ชื่อว่า Entity

class Entity extends BusinessObject {
  final String accountNumber;
  String name;
  String lastname;
  int age;
  Date dateOfBirth;
  //..some other related fields
}

เวลาที่ผมเปลี่ยนค่าใน dateOfBirth จะต้องมีการเปลี่ยนค่าของ age ด้วย ถูกไหมครับ ?

void setDateOfBirth(Date date) {
  dateOfBirth = date;
  age = calculateAge(dateOfBirth);
}

ถ้าเรายกกระบวนการตรงนี้ไปไว้ใน Business Process เนี่ยจะเกิดการซ้ำซ้อน (redundant) เกิดขึ้นได้

ทั้งนี้เราอาจจะใช้การคำนวนอายุใหม่ทุกครั้งที่มีการเข้าถึงแทน อันนี้ก็แล้วแต่ความเหมาะสมครับ

จะว่าไปผมควรจะเขียนตัวอย่างของ Business Process ให้ดูสักหน่อยเนอะ ? สมมติว่าผมมี BP สำหรับการเรียกดูและปรับเปลี่ยนที่อยู่ของผู้ใช้นะครับ

class AddressMaintenanceProcess extends BusinessProcess {
  private final Entity entity;
  private ArrayList<Address> addressList;
  private int index = 0;
  AddressMaintenanceProcess(String entityId) throws DataNotFoundException {
    entity = Entity.searchForId(entityId);
    addressList = copyList(entity.getAddressList());
  }

  public String name { return entity.getName();}
  public String lastName { return entity.getLastName();}
  public String[] getAddressText { return addressList[currentIndex].getAddressText();}
  public String[] getValidPostalCodes { return addressList[currentIndex].getValidPostalCodes(); }

  public void setIndex(int index) { this.index = index;}
  public void getIndex() { return index }

  public void commitChanges() { 
    entity.setAddressList(addressList);
    entity.commitChanges(); 
  }
}

อะไรทำนองนี้

ในความเป็นจริง โค๊ดส่วนของ Business Logic นั้นจะถูกเขียนเพื่อให้ไม่เกิดการยึดติด (Code Cohesion) กับโค๊ดส่วนอื่น ๆ (เช่นส่วนของ UI) มากนัก เพราะเราอาจจะมีการยกเอา BL ไปใช้กับแอพลิเคชั่นหลาย ๆ ตัวที่ใช้ส่วนประกอบอื่น ๆ ที่แตกต่างกัน ซึ่งตรงนี้สามารถที่จะทำเป็นลักษณะของ Web Service ไปก็ได้ (ใช้โปรโตคอล HTTP ในการคุยกันระหว่างส่วนประกอบต่างๆ) หรือจะยังทำเป็นโค๊ดโปรแกรมธรรมดา แต่มีการออกแบบคลาสให้มีชุดฟังก์ชั่นมาตรฐานในแต่ละคลาสเพื่อให้สามารถแยกส่วนไปใช้กับโปรแกรมอื่นได้ง่ายก็ได้ครับ (อันนี้เป็นเรื่องของการออกแบบซึ่งก็ต้องศึกษาข้อดีข้อเสียกันเองนะ)

ตัวที่ผมทำงานด้วยประจำจะเป็นแบบการสร้างฟังก์ชั่นมาตรฐานที่ใช้การรับส่งค่าผ่าน key-value น่ะครับครับ (ผมเรียก key ว่า fieldId นะ) คือก็ประมาณว่าแต่ละ process และ business object จะมีมีฟังก์ชั่น getField กับ setField เพื่อที่จะใช้ในการรับส่งค่าระหว่างกัน อะไรทำนองนี้ครับ

ก็ขอจบเรื่องของ Business Logic เอาไว้แค่นี้ละกัน มีอะไรสงสัยก็ถามได้ครับผม