Hops

From ICO wiki
Jump to navigationJump to search

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. Visual Studio solution-failis on eraldi projektina ka WCF-rakendus (WcfService), mis stub'ina ootab tuleviku teostust.

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. Pisut Internetis ringi kolades, võin öelda, et Factory meetod on pigem klassikaline, ning Dependency Resolver uuemat laadi. Antud lahenduse skoobis, antud tehnikate vahe ei löö välja, aga kui projekt areneb, arvan et Factory meetod võib saada pudelikaelaks.

Kasutatud EF erinevaid sättimise võimalusi optimaalse tulemuse saamiseks andmebaasi poole pealt:

  • Cascade On-Delete seadistamine (Antud võimalust otsisid taga ka retsensiooni autorid. Aitähh :) )
  • Välja kommenteerituna, aga siiski. Kurikuulusatest S-idest lahti, mis iga olemi nime lõppu EF topib.

Repository poole pealt võiks välja tuua selle, et eeldatud, on et iga objekti repodel on ühesugused meetodid. Projekti edasi arenendes võib see saada pudelikaelaks.

Web API teenus

Esimese asjana märkasin ja võibolla abiks ka õppejõule, et ennem veebi käivitamist tuleb käivitada konsooli rakenduse, mis tekitab vajalikud andmed andmebaasi. Seejärel alles saab asuma WEB API testimist.

Teenusest endast

Web API teenus töötab api/currency väljastab valuutade nimekirja. Paraku ei ole meetodit, mis kehtivad valuuta vahetuse kursid väljastaks. CRUD operatsioonidest on esindatud retsensiooni kirjutamise hetkel R-Read.

Osaliselt on teostatud CurrencyController. HomeController ja ValuesController on jäänud sinna projekti templeidist.

Vaikimisi väljastab teenus andmed xml-formaadis. Kui GET päringu päisesse panna Accept "text/json", siis väljastab JSON formaadis.

Logimine

Logimise jaoks oli eeldus loodud. Vajalikud koodiread failides Filters/WebAPIActionLoggingAttribute.cs ja Modules/MyModule1.cs oli välja kommenteeritud. Retsensenseeriad ei hakanud kommentaare eemaldama ning logimise osa testima.

Kasutajate audentimisest ja autoriseerimisest

Ü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. Ära on märgitud viited kui kasutatud weebi ja õppejõudude materjali abi. Meeldib, et lahendusele on lähenetud minimalistliku printsiibiga: Teha mustris võimalikult vähe muudatusi kui võimalik. Iga projekti Referencide nimekirja vaadates ei hakanud midagi kummalist silma, kõik on selliselt nagu peab.