[DOP] DOP를 적용해보자

최지영·2024년 12월 27일
0

👏 DOP를 코드에 녹여보기

Dop(Data Oriented Programming)은 기본적으로 클래스로 데이터를 관리하는 방식보다 자바나 스칼라에서는 Map과 같은 범용적인 자료구조 데이터를 활용할수있고 이를 레코드라 부른다. 아무래도 파이썬이나 함수형 프로그래밍에서 활용하기 더 적합해 보이나 JVM언어 진영에서도 근래에 들어서는 밀봉클래스 record 등등이 있으니 앞으로 Dop개념을 자바나 스칼라 코드에 조금은 적용해 보려고 함

  • UserRandomGenerator
    테스트 데이터 생성하는 클래스
import scala.util.Random

object UserRandomGenerator {
  // 랜덤 IP 생성 함수
  def randomIP(): String = {
    s"${Random.nextInt(256)}.${Random.nextInt(256)}.${Random.nextInt(256)}.${Random.nextInt(256)}"
  }

  // 랜덤 duration 생성 함수 (초 단위로 랜덤 값 생성)
  def randomDuration(): Double = Random.nextInt(10000)

  // 100개의 랜덤 데이터 생성
  def generateRandomData(count: Int): List[Map[String, Object]] = {
    (0 until count).map { i =>
      Map(
        "user" -> s"Alice$i", // Alice 뒤에 숫자 추가
        "ip" -> randomIP(), // 랜덤 IP 주소
        "info" -> Map(
          "duration" -> randomDuration() // 랜덤 duration
        )
      )
    }.toList
  }

}
  • RecordManagement 클래스
    공용적으로 Dop에서 레코드라고 불리는 단위의 데이터를 빼거나 Set할수있는 클래스
object RecordManagement{
  def get(map:Map[String,Object],keys:List[String]):Option[Object]={
    keys.foldLeft(Option(map):Option[Object]){
      (acc,key)=>acc.flatMap{
        case m:Map[String,Object] =>m.get(key) //Map안에 해당 키가 있으면 그 값을 리턴
        case _ =>None
      }
    }
  }
}
  • UserManagement클래스
    사용자의 정보를 관리하는 Object 클래스
object UserManagement  {

  def renameUserName(user:Map[String,Object],reName:String): Map[String,Object]={
    user.updated("user",reName)
  }

  def userFilterByName(user:Map[String,Object]):Boolean={
    val name:String  = user("user").asInstanceOf[String]
    name == "Alice0" || name =="Alice1"
  }

  def addUserKey(user:Map[String,Object],addKey:String,value:Object)={
    user + (addKey->value)
  }

  def searchUserVodDuration(user:Map[String,Object],keys:List[String]): Boolean = {
    RecordManagement.get(user,keys).get.asInstanceOf[Double] > 0
  }
}
  • UserManageDemo
    App을 상속받은 EntryPoint 클래스
object UserManageDemo extends App {
  val randomUsers = UserRandomGenerator.generateRandomData(100)

  val filteredUser:List[Map[String,Object]] = randomUsers
    .filter(user=>UserManagement.userFilterByName(user))
    .map(user=>UserManagement.renameUserName(user,"alice1"))
    .map(user=>UserManagement.addUserKey(user,"address","123123"))
    .filter(user=>UserManagement.searchUserVodDuration(user,List("info","duration")))

  filteredUser.foreach(println)
}

0개의 댓글