Conversion Between DTO and Entity Classes in Scala

When you practicing DDD (Domain-Driven-Design), you need to create different bounded countexts, for example when you receive DTO object PersonDTO, It should be mapped to PersonEntity. This conversion, have lots of repetitive works to copy fields of one object to another.

In scala there is type-safa data transoformer chimney which can do it for you with macros and providing simple dsl for it.

Scala-Automapper is another library which is similar to chimney but when you have some difference in fields type, you can’t do it, easily like chimney

Scala Intramap

Intramap have following definition:

def imap[A, B](fa: F[A])(f: A => B)(g: B => A): F[B]

So when you have Funtor[A] and you want to create new Functor[B] which is invariant with Functor[A] you can use imap method.

In following example, You I’ve wrote Codec for Person type, by using String Codec.

trait Codec[A] {
  self =>
  def encode(value: A): String

  def decode(value: String): A

  def imap[B](dec: A => B, enc: B => A): Codec[B] = new Codec[B] {
    override def encode(value: B): String =
      self.encode(enc(value))

    override def decode(value: String): B =
      dec(self.decode(value))
  }
}

def encode[A](value: A)(implicit c: Codec[A]): String = c.encode(value)

def decode[A](value: String)(implicit c: Codec[A]): A = c.decode(value)


object CodecImplicits {


  implicit val stringCodec: Codec[String] = new Codec[String] {
    override def encode(value: String): String = value

    override def decode(value: String): String = value
  }

  implicit val intCodec: Codec[Int] = stringCodec.imap(
    _.toInt, _.toString
  )
}

import CodecImplicits._

case class Person(name: String, age: Int)

implicit val personCodec: Codec[Person] = stringCodec.imap[Person](
  str => {
    val lines = str.split(',')
    Person(decode[String](lines(0)), decode[Int](lines(1)))
  },
  person => s"${person.name},${person.age}"
)

val ali: String = encode[Person](Person("Ali", 25))
val mohammad: Person = decode[Person]("Mohammad,23")

println(ali)
println(mohammad)

Result:

Ali,25
Person(Mohammad,23)

Scala Contramap

Contramap function have the following definition:

def contramap[A, B](fa: F[A])(f: B => A): F[B]

For example scala.math.Ordering have by function that is contramap, we can create Complicated orderings by use of Simple Orderings.

def by[T, S](f: T => S)(implicit ord: Ordering[S]): Ordering[T]

Create Ordering for type Money with by contramap

case class Money(amount: Int)

import scala.math.Ordered._

implicit val moneyOrdering: Ordering[Money] = Ordering.by(_.amount)

Money(300) < Money(200)

معرّفی شمابگو

شمابگو، یک شبکهٔ اجتماعی پرسش و پاسخ است.

در شمابگو

  1. شما می‌توانید در هر زمینه‌ای که سؤال داشتید، سؤال بپرسید و منتظر پاسخ دیگران بمانید و به سؤالات دیگران پاسخ دهید و امتیاز بگیرید.
  2. می‌توانید برای هر سؤالی که می‌پرسید چند برچسب انتخاب کنید، تا سؤال شما توسط دیگران به راحتی با استفاده از برچسب‌ها قابل جست-وجو باشد.
  3. پس از اینکه به پاسخ مورد نظرتان رسیدید، می‌توانید پاسخ برتر، یا پاسخی که توانسته مشکل شما را حل کند را به عنوان پاسخ نمونه انتخاب کنید.
  4. هر فرد پس از کسب تعداد مشخصی از امتیاز، امکانات مدیریتی او بیشتر و بیشتر خواهد شد. به طوری که پس از میزان مشخصی امتیاز، می‌تواند سؤالات نامرتبط، زرد، اسپم و … را از شمابگو حذف کند. سؤالاتی که به لحاظ معنایی یا نگارشی نیاز به ویرایش دارند، را ویرایش کند.
  5. هر کس می‌تواند یک پروفایل برای خود بسازد و خودش را در قالب جملاتی به دیگران معرفی کند. در پروفایل هر کس، سابقهٔ فعّالیّت او در شمابگو برای دیگران قابل رؤیت است؛ از جمله سؤالاتی که پرسیده، سؤالاتی که پاسخ داده.
  6. در کنار هر سؤال، سؤال‌های مرتبط با آن که توسط دیگر کاربران پرسیده نمایش داده می‌شود تا در صورتی که کاربر علاقه‌مند بود بتواند پرسش-و-پاسخ‌های مرتبط را نیز مشاهده کند.
  7. لازم نیست وقتی سؤال پرسیدید، هر از گاهی شمابگو را باز کنید تا ببینید دیگران چه پاسخی به سؤال شما داده‌اند بلکه وقتی به یکی از سؤالاتی که پرسیده‌اید، پاسخی داده شود، رایانامه‌ای برای شما ارسال خواهد شد و شما را از پاسخ جدید باخبر می‌کند.
  8. به صورت دوره‌ای برای مثال هر دو هفته یکبار، فهرست سؤالات اخیر و سؤالات مهم برای شما ارسال می‌شود و می‌توانید در جریان آخرین مباحث داغ شمابگو قرار بگیرید.

طرح پیشنهادی پرسش-و-پاسخ

گوشزد ۱: این نوشته برای ارائه به مرکز تحقیقات و نشر معارف اهل‌البیت یا هر شخصیّت حقیقی/حقوقی جهت تأمین هزینه‌های طرح، تنظیم شده است. گوشزد ۲: در این نوشته، طرح به صورت کلّی بیان شده و از بیان جزئیات پرهیز شده است.

پیامبر خدا صلی الله علیه و اله و سلم فرمودند:

وَ قَالَ ص اَلْعِلْمُ خَزَائِنُ وَ مَفَاتِيحُهُ اَلسُّؤَالُ فَاسْأَلُوا رَحِمَكُمُ اَللَّهُ فَإِنَّهُ تُؤْجَرُ أَرْبَعَةٌ اَلسَّائِلُ وَ اَلْمُتَكَلِّمُ وَ اَلْمُسْتَمِعُ وَ اَلْمُحِبُّ لَهُمْ. /تحف العقول ص ۴۱

دانش گنجينه هايي است كه كليدهايش پرسش است، پس بپرسيد-خداوند شما را رحمت كناد ، زيرا در اين پرسش و پاسخ چهار كس اجر و مزد گيرند: پرسشگر، پاسخگو، شنونده و دوستدار آنان.

هدف

هدف: طراحی سیستم پرسش-و-پاسخی که هر کسی بتواند آزادانه سؤال خود را مطرح کند و دیگران بتوانند سؤال او را پاسخ دهند.

مزایا

  1. پرداختن به سخن نه به صاحب سخن در فضای مباحثه در صورتی که هویت و کارنامهٔ علمی دو طرف گفت-و-گو از یکدیگر پوشیده باشد، باعث می‌شود که دو طرف گفت-و-گو با یکدیگر در مورد آنچه به بحث گذاشته می‌شود تمرکز کنند.
  2. اجازهٔ طرح و بیان مسئله به افرادی که قدرت بیان مناسبی ندارند داده می‌شود با توجه به اینکه عده‌ای با قاطعیّت و صلابت نظرات خود را به راحتی در فضای مباحثهٔ حضوری بیان می‌کنند اما افرادی وجود دارند که برای بیان افکار خود قدرت بیان خوبی ندارند، فضای مجازی به این افراد کمک می‌کند تا خارج از جوّ هیاهوی مباحثه، افکار خود را بیان کنند.
  3. بایگانی شدن بحث‌ها برای استفادهٔ دیگران بدون شتابزدگی این سیستم‌ها به کاربران این فرصت را می‌دهد که خارج از هیاهوی مباحثه، در فرصت مناسب مباحث مطرح شده بین افراد را مطالعه کند.
  4. میدان دادن به افرادی که از بازگو کردن سؤالات خود واهمه دارند با توجه به اینکه بسیاری از مردم، از پرسیدن سؤالات بنیادین و به چالش کشیدن باورهای عمومی و رایج واهمه دارند، ایجاد فضایی که مردم بتوانند بدون ابراز هویّت خود، اندیشه‌ها و سؤالات خود را مطرح کنند کمک به باز شدن فضای گفتمان در جامعه خواهد شد.
  5. گذر از فضای جدلی و معطوف-به-قدرت به فضای هم‌اندیشی و معطوف-به-حقیقت تفکر کلامی (تئولوژیک)، در پی اثبات باورهای خود است نه در پی کشف حقیقت. از این رو افراد پاسخگو در طرح‌های پاسخگویی به شبهات، در صدد پاسخ‌گویی و اثبات باورهای خود به مخاطبین هستند و فضای گفتمان و هم‌اندیشی با مخاطب خود برقرار نمی‌کنند همین موضوع باعث می‌شود که نه تنها حقیقت برای طرفین به خوبی منکشف نشود، بلکه باعث دفع مخاطب برای بحث و گفت-و-گو می‌شود. از این رو بهتر است که داعیهٔ پاسخگویی نداشته باشیم بلکه بستری مناسب برای گفتمان فراهم کنیم.

موضوعات پرسش-و-پاسخ

هدف اصلی از طراحی چنین وب‌گاهی، ایجاد فضایی برای هم‌اندیشی و گفتمان در زمینه‌های اعتقادی و هستی‌شناسی‌ست. اما با توجه به سابقهٔ سایت‌هایی مثل استک‌اکسچنج و کورا، می‌توان به مرور در تمامی زمینه‌های علمی و مورد نیاز، زیردامنه‌هایی برای بحث و گفت-و-گو در آن موضوع فراهم کرد. موارد زیر نمونه‌ای از این موضوعات می‌تواند باشد:

  • قرآن
  • احادیث
  • سلامت
  • خانواده و تربیت فرزند
  • آشپزی
  • ورزش و تفریح
  • تلویزیون و فیلم
  • فلسفه
  • عرفان

کارهای فعلی

کارهای انجام شدهٔ فعلی اکثراً حالت هم‌اندیشی ندارند:

اما نمونه‌های خوب که مدّنظر ماست:

که در میان این نمونه‌های خوب، نمونهٔ مناسبی برای زبان فارسی وجود ندارد، به همین جهت مناسب است که در راه‌اندازی چنین سایتی تلاش کنیم.

و در انتها، این نوشته را با جملهٔ زیبایی از هیدگر به پایان می‌رسانم که می‌گفت «پرسش، تقوی تفکر است».