官术网_书友最值得收藏!

  • Professional Scala
  • Mads Hartmann Ruslan Shevchenko
  • 305字
  • 2021-07-23 17:24:27

OO in Our Chatbot

Now that you know the theoretical basics, let's look at these facilities and how they are used in our program. Let's open Lesson 2/3-project in our IDE and extend our chatbot, which was developed in the previous chapter.

Decoupling Logic and Environment

To do this, we must decouple the environment and logic, and integrate only one in the main method.

Let's open the EffectsProvider class:

Note

For full code, refer to Code Snippets/Lesson 2.scala file.

trait EffectsProvider extends TimeProvider {

 def input: UserInput

 def output: UserOutput

}

object DefaultEffects extends EffectsProvider
{
 override def input: UserInput = ConsoleInput

 override def output: UserOutput = ConsoleOutput

 override def currentTime(): LocalTime = LocalTime.now()

 override def currentDate(): LocalDate = LocalDate.now()
}

Here, we encapsulate all of the effects into our traits, which can have different implementations.

For example, let's look at UserOutput:

For full code, refer to Code Snippets/Lesson 2.scala file.

trait UserOutput {

 def write(message: String): Unit

 def writeln(message: String): Unit = {
  write(message)
  write("\n")
 }

}


object ConsoleOutput extends UserOutput
{

 def write(message: String): Unit = {
  Console.print(message)
 }
}

Here, we can see the trait and object, which implement the current trait. This way, when we need to accept commands that are not from standard input, but from the chatbot API or from Twitter, we only need to change the implementation of the UserOutput/ ConsoleOutput interfaces.

It's now time to implement ConsoleOutput and DefaultTimeProvider.

Replace ??? in main with the appropriative constructor.

These steps for implementing ConsoleOutput and DefaultTimeProvider are as follows:

  1. Ensure that Lesson 2/3-project is open in IDE.
  2. In the UserOutput file, find the ConsoleOutput file and change ??? to the body of the write method. The resulting method should look like this:
    object ConsoleOutput extends UserOutput{
    def write(message: String): Unit = {
    Console.print(message)
    }
    }
    }
  3. In the TimeProvider file, add the DefaultTimeProvide object which extends from TimeProvider and implements the currentTime and currentDate functions. The resulting code should look like this:
    object DefaultTimeProvider extends TimeProvider {
    override def currentTime(): LocalTime = LocalTime.now()
    
      override def currentDate(): LocalDate = LocalDate.now()
      }
    
     }
主站蜘蛛池模板: 汕尾市| 太原市| 工布江达县| 常熟市| 广安市| 饶河县| 尉犁县| 高州市| 横峰县| 招远市| 阜宁县| 曲水县| 淮南市| 赤峰市| 鲜城| 广安市| 永安市| 新乐市| 赣榆县| 石屏县| 江华| 贵德县| 宁明县| 玉龙| 沙洋县| 略阳县| 武川县| 额尔古纳市| 苍南县| 甘洛县| 邵阳市| 桂阳县| 余干县| 砀山县| 宁陵县| 汾西县| 山阴县| 芮城县| 隆化县| 额尔古纳市| 凉城县|