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