Pattern matching - 2. část

V tomto článku se podíváme na speciálnější případy použití pattern matchingu a srovnání s polymorfismem, který může být alternativním přístupem k tvorbě operací nad nějakou hierarchií tříd.

Pattern matching pro ošetření výjimek

Pattern matching není ve Scale žádnou okrajovou konstrukcí, je přirozenou integrální součástí Scaly, používá se např. jako standardní konstrukce k ošetření výjimek:

Partial function

Pomocí case větví můžeme vytvořit funkci definovanou pouze pro určité hodnoty (partial function):

Přímá extrakce hodnot z objektu

Pattern matching můžeme použít pro přímou dekompozici objektu na hodnoty (val). Stačí uvést jeden z typů patternů, které jsme si představili v první části seznamování s pattern matchingem, hned za klíčovým slovem val:

Patterny ve výrazu for

Namísto proměnné (přesněji řečeno val), do které se postupně ukládají prvky produkované generátorem, tj. na levé straně od <-, lze obecně použít pattern:

Pattern matching nebo polymorfismus?

Při matchování komplexnějších typů a tvorbě operací nad těmito typy je alternativou k pattern matchingu polymorfismus využívaný v objektově orientovaném programování. Také pomocí něj můžeme intuitivně a typově bezpečně provést dekompozici instancí z hierarchie tříd a vyextrahovat potřebná data/provést nad nimi návazné operace. Každá třída si může logiku operace implementovat po svém pomocí přepisovatelné virtuální metody.

Pokud implementujeme operaci zpracovávající různé instance z hierarchie tříd pomocí pattern matchingu, můžeme operaci vyčlenit zcela vně hierarchie tříd, nebo také do základního traitu, od kterého jsou odvozeny všechny třídy hierarchie. V každém případě máme kompletní implementaci operace vždy na jednom místě. Snadno můžeme připravit různé implementace (strategie) provádění operací a měnit je, ale toho můžeme ve Scale snadno dosáhnout i při použití polymorfních operací a implicitně předávaných parametrů - strategií, kterými se bude vnitřní implementace řídit.

Pattern matching je obecně vhodnější použít v případě, kdy chceme mít možnost flexibilně přidávat do aplikace další operace prováděné nad hierarchií typů a operace se mění častěji než počet tříd v hierarchii, která je poměrně ustálená. V případě polymorfní implementace vyžaduje přidání další operace zásah přímo do různých tříd z hierarchie typů, kdežto při použití pattern matchingu měníme logiku pohodlněji na jediném místě.

Pokud naopak chceme přidávat flexibilně další třídy a operace se příliš nemění, je vhodnější použít polymorfismus - stačí přidat konkrétní třídu a implementovat pro ni specifickým způsobem potřebné operace (tj. změny provádíme opět jen v jediném zdrojovém souboru).

Je potřeba použít vždy vhodnou techniku pro poněkud protichůdné situace množení tříd/množení metod ve třídách.

Kam dále?

Další příklady pattern matchingu naleznete na slidech přednášky Scala Essentials: Pattern Matching and Case Classes, která se konala minulý týden na FITu. Karel Smutný v přednášce podrobně probral různé případy použití pattern matchingu.

Zdroje

  1. Odersky, Martin, Lex Spoon, Bill Venners. Programming in Scala, Second Edition. Artima Press, 2010. Web: http://booksites.artima.com/programming_in_scala_2ed.
  2. Odersky, Martin. Functional Programming Principles in Scala. 2012. Dostupné na webu: https://class.coursera.org/progfun-2012-001/class/index.
  3. Robertson, Ian. Pattern matching in Scala for expressions. 2010. Web: http://www.artima.com/weblogs/viewpost.jsp?thread=281160.

Článek obsahuje 0 komentářů