«نوع دادهی مات» یک تکنیک کپسولهسازی در Elm است.
بعضیها به این کار «پنهانسازی اطلاعات» یا «پنهان کردن جزئیات پیادهسازی» هم میگویند.
همچنین معمولاً از این نوع برای اعمال اعتبارسنجی استفاده میشود، با بهکارگیری الگوی «تجزیه کنید، اعتبارسنجی نکنید».
برای مثال، میتوانید یک نوع دادهی مات EmailAddress داشته باشید که فقط میتواند نشانیهای ایمیل معتبر را در خود نگه دارد (برخلاف String که میتواند هر مقدار دلخواهی را در خود جای دهد).
نوع دادهی سفارشی یک یا چند «گونه» دارد و کامپایلر بهطور خودکار برای ساختن هر گونه تابعی تولید میکند که از اسم آن گونه استفاده میکند. این توابع تنها راه ساخت نوع دادهی سفارشی هستند. کامپایلر امکان الگوشکافی این گونهها را نیز فراهم میکند.
type Maybe a
= Nothing --> Variant implies a 'Nothing' function, with type 'Maybe a', and destructuring of 'Nothing'
| Just a --> Variant implies a 'Just' function, with type 'a -> Maybe a', and destructuring of 'Just _'
بهطور پیشفرض، همهی اینها درون خود فایل / ماژول هستند و ما با کلیدواژهی exposing انتخاب میکنیم که کدام بخشها صادر شوند.
ماژول Maybe نوع Maybe را آشکار میکند (تا ماژولهای دیگر بتوانند از مقادیر موجود Maybe استفاده کنند) و همچنین گونههای Nothing و Just را آشکار میکند (تا ماژولهای دیگر بتوانند مقادیر Maybe را بسازند و الگوشکافی کنند).
برای این کار از نحوهی نگارش زیر استفاده میکند.
بخش Maybe(..) به Elm میگوید که همهی گونهها و همچنین تعریف نوع دادهی سفارشی را آشکار کند.
module Maybe exposing
( Maybe(..)
-- ...
)
برای ساختن یک نوع دادهی مات، کافی است انتخاب کنید که گونهها را صادر نکنید.
برای انجام این کار با نوع Maybe، از نحوهی نگارش زیر استفاده میکنید:
module Maybe exposing
( Maybe
-- ...
)
وقتی این کار را میکنید، تقریباً همیشه باید راه دیگری برای ساختن و گرفتن گونهها فراهم کنید، با آشکار کردن توابع سفارشی. این توابع سفارشی به شما امکان میدهند هنگام ساختن و گرفتن گونهها، منطقی را اعمال کنید. این کار جزئیات پیادهسازی درونی ماژول را پنهان میکند و به این معناست که میتوانید جزئیات پیادهسازی را هرقدر که میخواهید تغییر دهید، تا زمانی که توابعی که آشکار میکنید یکسان بمانند. همچنین به شما امکان میدهد هنگام ساختن و استفاده از این نوع، نامتغیرها را حفظ کنید.
احتمالاً رایجترین کاربرد نوع دادهی مات، اعمال اعتبارسنجی با الگوی «تجزیه کنید، اعتبارسنجی نکنید» است.
در این الگو، تابعی را آشکار میکنید که ورودیای با ساختار / ایمنی نوع کمتر از آنچه میخواهید میگیرد، مثل String، و بعد آن را به نوعی ساختیافتهتر، مثل EmailAddress، تجزیه میکند؛ یا خود نوع را برمیگرداند یا یک خطا (معمولاً Maybe یا Result).
برای مثال، در کد زیر فقط ماژولهای بیرونی میتوانند با استفاده از تابع parseEmailAddress یک نوع EmailAddress بسازند، بنابراین وقتی با نوع EmailAddress کار میکنید، مطمئن هستید که معتبر است.
module EmailAddress exposing ( EmailAddress, parseEmailAddress, getEmailAddress )
-- The `EmailAddress` custom type has one variant, also called `EmailAddress`
-- When a custom type has one variant, it is idiomatic to use the same name for both.
type EmailAddress =
EmailAddress String
-- create an EmailAddress variant
parseEmailAddress: String -> Maybe EmailAddress
parseEmailAddress candidateEmailAddress =
if isValidEmailAddress candidateEmailAddress then
Just (EmailAddress candidateEmailAddress)
else
Nothing
-- get an EmailAddress variant
getEmailAddress: EmailAddress -> String
getEmailAddress ( EmailAddress emailAdress ) =
emailAdress
isValidEmailAddress: String -> bool
-- ...