Hops: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Line 255: Line 255:
=== Veebiteenuse retsensioon - TeravC===
=== Veebiteenuse retsensioon - TeravC===
==== Arhitektuuriline ja tehnoloogiline ülesehitus ====
==== Arhitektuuriline ja tehnoloogiline ülesehitus ====
Lahendus on vastavalt kursuse nõuetele ülesse ehitatud, eraldades projektidena andmemudeli teegi, andme ligipääsu teegi ning teenuse enda teostuse. Kasutusel Code first Entity Framework andmeligipääsu kihis, ning ASP.NET Web API teenuste poole pealt.
Lahendus on vastavalt kursuse nõuetele ülesse ehitatud, eraldi seisvad projektid eri otstarbega teekidena:
* andmemudeli teegi (CurrencyModelsLibrary),  
* andme ligipääsu teegi (CurrencyDAL),
* teenuse enda teostuse (ASPNETMVCService).
 
Kasutusel Code first Entity Framework andmeligipääsu kihis, ning ASP.NET Web API teenuste poole pealt.


==== Domeeni mudel ====
==== Domeeni mudel ====

Revision as of 17:01, 26 May 2013

Meeskond

  • Liikmed:
    • Artur Hokkonen
    • Margus Parts
    • Hanno Sirkel
    • Lauri Õunmaa

Idee

Luua 4-tasemeline XML definitsioon, näidis sellele ning transleerimised HTML ja XML formaati.

XML

XML fail

<?xml version="1.0" encoding="UTF-8"?>
<tns:autod xmlns:tns="http://www.example.org/autod" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/autod autod.xsd ">
  <tns:auto id="0" mark="Ford" mudel="Sierra">
    <tns:mootor>
      <tns:kytus>bensiin</tns:kytus>
      <tns:kubatuur yhik="ccm">2000</tns:kubatuur>
    </tns:mootor>
    <tns:kere v2rv="punane"/>
  </tns:auto>
  
  <tns:auto id="1" mark="ZAZ" mudel="969">
    <tns:mootor>
      <tns:kytus>diisel</tns:kytus>
      <tns:kubatuur yhik="ccm">2500</tns:kubatuur>
    </tns:mootor>
    <tns:kere v2rv="roheline"/>
  </tns:auto>
    
  <tns:auto id="2" mark="Saab" mudel="9-5">
    <tns:mootor>
      <tns:kytus>bensiin</tns:kytus>
      <tns:kubatuur yhik="ccm">1500</tns:kubatuur>
    </tns:mootor>
    <tns:kere v2rv="sinine"/>
  </tns:auto>
  
  <tns:auto id="3" mark="Volvo" mudel="960">
    <tns:mootor>
      <tns:kytus>elekter</tns:kytus>
    </tns:mootor>
    <tns:kere v2rv="sinine"/>
  </tns:auto>

  <tns:auto id="4" mark="Volvo" mudel="V40">
    <tns:mootor>
      <tns:kytus>diisel</tns:kytus>
      <tns:kubatuur yhik="ccm">2400</tns:kubatuur>
    </tns:mootor>
    <tns:kere v2rv="must"/>
  </tns:auto>
  
  <tns:auto id="5" mark="Volvo" mudel="V70">
    <tns:mootor>
      <tns:kytus>gaas</tns:kytus>
      <tns:kubatuur yhik="ccm">2000</tns:kubatuur>
    </tns:mootor>
    <tns:kere v2rv="valge"/>
  </tns:auto>
  
</tns:autod>

XSD fail

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.example.org/autod" 
  xmlns:tns="http://www.example.org/autod"
  elementFormDefault="qualified">

    <simpleType name="kytusSimpleType">
    	<restriction base="string">
    		<enumeration value="bensiin"></enumeration>
    		<enumeration value="diisel"></enumeration>
    		<enumeration value="elekter"></enumeration>
    	</restriction>
    </simpleType>

    <complexType name="mootorComplexType">
    	<sequence>
    		<element name="kytus" type="tns:kytusSimpleType"
    			maxOccurs="1" minOccurs="0">
    		</element>
    		<element name="kubatuur" maxOccurs="1" minOccurs="0">
    			<complexType>
    			 	<simpleContent>
      					<extension base="int">
    						<attribute name="yhik" use="required">
		    					<simpleType>
									<restriction base="string">
										<enumeration value="ccm"/>
										<enumeration value="l"/>
									</restriction>
								</simpleType>
							</attribute>
						</extension>
   					</simpleContent>
				</complexType>
    		</element>
    	</sequence>
    </complexType>

    <complexType name="autoComplexType">
    	<sequence>
    		<element name="mootor" type="tns:mootorComplexType"></element>
    		<element name="kere" type="tns:kereComplexType"
    			maxOccurs="1" minOccurs="1">
    		</element>
    	</sequence>
    	<attribute name="id" type="int"></attribute>
        <attribute name="mark" type="string"></attribute>
        <attribute name="mudel" type="string"></attribute>
    </complexType>
    
    <simpleType name="v2rvSimpleType">
    	<restriction base="string">
    		<enumeration value="punane"></enumeration>
    		<enumeration value="roheline"></enumeration>
    		<enumeration value="sinine"></enumeration>
    	</restriction>
    </simpleType>

    <complexType name="kereComplexType">
        <attribute name="v2rv" type="tns:v2rvSimpleType"></attribute>
    </complexType>

    <element name="autod" type="tns:AutodListComplexType"></element>
    
    <complexType name="AutodListComplexType">
    	<sequence>
    		<element name="auto" type="tns:autoComplexType" maxOccurs="unbounded" minOccurs="0"></element>
    	</sequence>
    </complexType>
</schema>

XSLT failid

XML -> HTML

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tns="http://www.example.org/autod">

<xsl:output encoding="UTF-8" method="html" />

<xsl:template match="/">
  <html>
  <body>

  <h2>Autode nimekiri</h2>

  <table border="1">
  <tr><td>Mark</td><td>Mudel</td><td>Värv</td><td>Mootor</td></tr>
  <xsl:for-each select="tns:autod/tns:auto">
  <tr>
    <td><xsl:value-of select="@mark"/></td>
    <td><xsl:value-of select="@mudel"/></td>
    <td><xsl:value-of select="tns:kere/@v2rv"/></td>
    <td><xsl:value-of select="tns:mootor/tns:kytus"/> <xsl:text> </xsl:text> <xsl:value-of select="tns:mootor/tns:kubatuur"/><xsl:value-of select="tns:mootor/tns:kubatuur/@yhik"/></td>
  </tr>
  <p> </p>
  </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

XML -> XML

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tns="http://www.example.org/autod">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <tns:autod>

      <xsl:for-each select="tns:autod/tns:auto">
        <xsl:if test="@mark='Volvo'">
        <auto>
         <mark>
           <xsl:value-of select="@mark"/> 
         </mark>
         <mudel>
           <xsl:value-of select="@mudel"/>
         </mudel>
        </auto>
        </xsl:if>
      </xsl:for-each>
    </tns:autod>
  </xsl:template>
</xsl:stylesheet>


Veebiteenus

Tähtajaks tehtud osa ("deadline" branch):

https://github.com/onu/currency-converter/tree/deadline1


"Master" branch:

https://github.com/onu/currency-converter

Retsensioonid

XML

Meeskond Hops on loonud xml vormingus faili autode teemal. Xml failil on neli loogilist dimensiooni ning kolmel neist on kasutatud atribuute, mis on enamat, kui lihtsalt id. Lisaks xml failile on loodud ka selle skeemifail xsd vormingus. Xml vormingus olevale failile on loodud 2 xslt faili: esimene neist transformeerib andmed html vormingusse ning tulemuseks on andmetabel, kus iga auto kohta on esitatud mark, mudel värv ja mootori andmed; teine xslt fail muudab algse xml faili vormingut ning välja antakse iga auto kohta margi ja mudeli andmed. Tehtud kodutöö vastab seega väga täpselt esitatud tingimustele.

Esitatud kodutöö kood ei ole kommenteeritud. Samuti ei ole meeskonna wiki lehel ühtegi kommentaari selle kohta, mis on antud XML alamülesande teema või eesmärk. Kuna kodutöö ülesande püstituses neid otseselt nõutud ei ole, siis ei saa seda ka puuduseks lugeda. Kood on sellegipoolest loetav ja arusaadav.

Ka dokumentatsiooni ei ole antud ülesande lahendusele lisatud, aga ka see ei olnud ka nõutud kodutöö ülesande püstituses. Samas, kui see ülesanne on loogiline osa ülejäänud kursuse kodutööde komplektist, siis juba alguses dokumentatsiooniga alustamine, oleks hea tava järgimine.

Puudustena võiks märkida, et meeskonna wiki lehel võiks siiski olla väike kokkuvõte tehtud töö sisust ja eesmärgist. Kuna kood ei ole kommenteeritud ning samuti ei ole lisatud dokumentatsiooni, siis oleks võinud meeskonna wiki lehel olla iga faili juure lause või kaks selgituseks. Kuna tehtud töö eesmärk (kui välja arvata kodutöö ära tegemise fakt) on selgusetu, siis on väga raske hinnata, kas esitatud xml fail on piisav või vajaliku struktuuriga. Ka ei saa sellistes tingimustes hinnata, kas lisatud atribuudid kolmel dimensioonil on asjakohased või mitte.

Meeskond Leemur

XML'i retsensioon

XML

XML-failis on dimensioonid 1. autod 2. auto 3. mootor, kere 4. kytus. kubatuur Kokku seega 4 dimensiooni- nagu nõutud. Atribuute on kasutatud kolmel dimensioonil- jällegi nõuetele vastavalt. Tegijad ei ole põhjendanud, miks auto atribuut "mark" ei võiks olla auto all eraldi dimensioon. Sealt edasi mõeldes võiks auto atribuut "mudel"olla auto alaelement samal tasemel koos margiga.

XSD

XSD-failis on XLSi elementide puhul nõutud, et nende elemendid oleksid kindlas järjekorras kirjeldatud. See on koodi selguse ja loetavuse seisukohalt hea. Koodi vaadates torkab silma, et auto värvidest on lubatud ainult punane, roheline ja sinine. Töö kirjeldusest ei tule välja, kas see on mingi spetsiifiline taotlus ja kui on, siis miks.

XSL

HTMLi kujule teisendavas koodis tundub kõik loogiline. HTMLi kujul esitatakse tabel, kus on auto mark, mudel, kere värv ja kütuseliik. Tabeli loomisel trükitakse välja nii XMLi elementide, kui ka nende atribuutide väärtusi. XMLi formaati töötlevas XSLi failis antakse väljundisse auto mark ja mudel juhul, kui automargiks on Volvo. Ülesande nõue, XMLi töötlemine XSLi koodiga, on seega täidetud.

Kokkuvõtvalt võib öelda, et ülesande formaalsed nõuded on kõik täidetud. Meeskond võiks selgituseks kirja panna loodava rakenduse eesmärgi ja veidike kommenteerida XMLi struktuuri. Vastasel juhul jääb lihtsalt mõnest lahendusest mulje, et see ei ole päris läbi mõeldud (näiteks atribuudi asemel võiks olla eraldi element).

Meeskond TeravC

Veebiteenuse retsensioon - TeravC

Arhitektuuriline ja tehnoloogiline ülesehitus

Lahendus on vastavalt kursuse nõuetele ülesse ehitatud, eraldi seisvad projektid eri otstarbega teekidena:

  • andmemudeli teegi (CurrencyModelsLibrary),
  • andme ligipääsu teegi (CurrencyDAL),
  • teenuse enda teostuse (ASPNETMVCService).

Kasutusel Code first Entity Framework andmeligipääsu kihis, ning ASP.NET Web API teenuste poole pealt.

Domeeni mudel

Andmemudel on lihtne ning selge. On, millest õppida. Meeldib mulle, et kasutusel Interface'id olemite ühtlustamiseks (IntegrityContracts). Lisaks teostatud korralik custom validator (NonNegativeDoubleAttribute).

Andmeligipääsu kiht

Andmeligipääsu kiht (DAL) teostatud nii, nagu kursusel õpetatud. Retsenseerija jaoks uudne oli lahendus, kus dependency resolver asemel kasutatakse Factory mustrit. Kasutatud EF erinevaid sättimise võimalusi optimaalse tulemuse saamiseks andmebaasi poole pealt.

Web API teenus

Ennem veebi käivitamist tuleb käivitada konsooli rakenduse, mis tekitab vajalikud andmed andmebaasi. Web API teenus töötab api/currency väljastab valuutade nimekirja. Paraku ei ole meetodit, mis kehtivad valuuta vahetuse kursid väljastaks. Ülesandes oli nõutud kasutajate audentimist, haldamist, kasutusstastikia pidamist. Valuuta vahetuse kursi kuvamine võib olla avalik teenus, seetõttu sellel nõudel suurt praktilist rakendust pole, aga miinusena mul tuleb see välja tuua :(.

Kodeerimise stiil ja parimad praktikad

Stiil on puhas, vajalikud ja ebaselged kohad ära kommenteeritud. Meeldib, et lahendusele on lähenetud minimalistliku printsiibiga: Teha mustris võimalikult vähe muudatusi kui võimalik.