ตรรกธุรกิจ – Business Logic

จั่วหัวภาษาไทยให้งงเล่นอีกแล้ว วันนี้จะพูดถึงเรื่องของ 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 เอาไว้แค่นี้ละกัน มีอะไรสงสัยก็ถามได้ครับผม

Wutipong Wongsakuldej

Programmer, interested in frontend applications, music and multimedia.

Latest posts by Wutipong Wongsakuldej (see all)

Leave a Reply

Your email address will not be published. Required fields are marked *