ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • method 이름은 같은데 param, return 타입을 다르게 구현하기
    scala/basic 2024. 3. 7. 17:06
    case class GoogleRaw(content: String, crawlId: String)
    case class NaverRaw(content: String)
    
    case class GoogleParsed(sections: Seq[String], crawlId: String)
    case class NaverParsed(sections: Seq[String])
    
    trait Cralwer {
      type Raw
      type Parsed
    
      def fetch(url: String): Raw
      def parse(raw: Raw): Parsed
      def save(raw: Raw, parsed: Parsed): Int
    }
    
    object GoogleCrawler extends Cralwer {
      type Raw = GoogleRaw
      type Parsed = GoogleParsed
    
      override def fetch(url: String): GoogleRaw = GoogleRaw("g", "id123")
    
      override def parse(raw: GoogleRaw): GoogleParsed = GoogleParsed(Seq(raw.content), raw.crawlId)
    
      override def save(raw: GoogleRaw, parsed: GoogleParsed): Int = 1
    }
    
    object NaverCrawler extends Cralwer {
      type Raw = NaverRaw
      type Parsed = NaverParsed
    
      override def fetch(url: String): NaverRaw = NaverRaw("n")
    
      override def parse(raw: NaverRaw): NaverParsed = NaverParsed(Seq(raw.content))
    
      override def save(raw: NaverRaw, parsed: NaverParsed): Int = 2
    }
    
    @main def main(): Unit = {
    //  val cralwer: Cralwer = GoogleCrawler
      val cralwer: Cralwer = NaverCrawler
    
      val content: cralwer.Raw = cralwer.fetch("http://www.some.com")
      val parsed: cralwer.Parsed = cralwer.parse(content)
    
      parsed match {
        case GoogleParsed(_, id)  => println(id)
        case NaverParsed(content) => println(content)
      }
    
      val savedCnt = cralwer.save(content, parsed)
      println(savedCnt)
    }

    'scala > basic' 카테고리의 다른 글

    Blocking Future  (0) 2023.02.13
    Environment, Property variable 읽기  (0) 2023.02.03
    Future[Try[A]] <=> Future[A] 상호간 변환하기  (0) 2023.01.16
    Error Modeling (with Exception)  (0) 2023.01.16
    Scala Using  (0) 2022.12.19

    댓글

Designed by Tistory.