Meeskond:MS-TO

From ICO wiki
Jump to navigationJump to search

MS-TO

Meeskonna liikmed

  • Margus Roo
  • Silja Saar
  • Tõnis Luik
  • Ott Kingisepp

XML Retsensioonid

  • XML faili kodutöö retsensioon meeskonnale /* Anonüümsed koodikommentaatorid */ [1]


Käesolevas retsensioonis analüüsitakse meeskonna “Anonüümsed koodikommentaatorid” poolt koostatud XML andme-, skeemi- ning transformatsiooni faile.


XML faili teemaks on filmikogu, mis sisaldab loetelu filmidest, koos informatsiooniga nende žanrite, valmimisaasta, sisu ning näitlejate kohta. Samuti sisaldub failis teemakohane pildimaterjal.


XML faili struktuur on loogilise ülesehitusega. Selles leidub XML-andmetele kohustuslik versioonideklaratsioon ning juurelement. Parema loetavuse huvides on kasutatud treppimist. Filmide sisukirjelduste juures on kasutatud CDATA-t, millega on tagatud, et HTML-is võib koodi kasutada muretsemata, et kirjelduse tekstis sisalduvad märgid võiksid XML faili struktuuri hilisemat kasutamist häirida. Koosatud XML fail valideerub.


Skeemifail on koostatud korrektselt, komplekstüüpe on kasutatud otstarbekalt. Lisaks on kasutatud required-elementi, mis viitab sellele, et meeskond on detailidele piisavat rõhku pannud. Samuti on positiivne minOccurs-i / maxOccurs-i kasutamine, mis näitab skeemifaili head läbimõeldust.


Transformatsiooni faile on esitatud kaks – pisut erineva informatsiooni hulga ning rõhuasetusega. Failide ülesehitus on otstarbekas. Kasutatud on css-i. Samatüübiliste andmete korduste jaoks tsükli loomiseks puhul on kasutatud for-each, select käsklust. Meeskonna poolt esitatud transformatsiooni failid annavad XML struktuuriga loodud sisu edukalt edasi.


Kokkuvõtteks: Meeskonna töö tulemusest väljendub, et meeskonna liikmed oskavad XML- ja XSL failidega töötada. Samuti teostada XML formaadilt HTML formaadile üleminekuid ning valdavad XSL võimalusi. Soovituseks niipalju, et ühtlase stiili hoidmiseks tuleks valida kas kasutada elementide nimedena läbivalt eesti- või inglise keelt.

Teenuse retsensioon

Sissejuhatus

Käesolev dokument on retsensioon meeskonna HMR projektile “NutiHoone”. Projekti eesmärk on koguda hoonest või hoone osast andurite andmeid ja kogutud andmeid visuaalselt esitleda rakenduse kaudu ennast tuvastavatele kasutajatele.

Retsensiooni esitaja soovib toonitada, et ei ole .Net arendusvahendite ja meetodite ekspert, seega võib tagasisides olevad osad tuleneda pigem dokumendi koostaja vähesest kogemusest, mitte projekti teostajate vajakajäämistest. Kuna antud retsensiooni looja keskendus teenuse poole hindamisele, siis kogu rakenduse funktsionaalset poolt ei hinnatud, pigem uuris testija kuidas on teenuse koodiosa realiseeritud.

Paigaldusprotsess

Arendajate soovitusel püüdis retsensiooni koostaja paigaldada esimese sammuna teenust, mida oli võimalik alla laadida VisualStudio projektifailina. Vaikimisi oli käivitatav projekt “DAL”, mida VisualStudio käivitada ei suutnud. Projekti struktuuri uurides oli loogiline valik vaikimisi projektiks seadistada “WebApiApp”, peale mida teenus käivitus ja testijal avanes veebilehitsejas ASP.NET projekti vaikimisi lehekülg.

Järgmise sammuna laadis retsensiooni kirjutaja rakenduse oma arvutisse ja pakkis lahti. Rakenduse puhul oli vaikimisi projekt seadistatud õige ja peale VisualStudio’s käivitamist ilmus ka veebileheküljel rakendusevaade. Lähtudes projektimeeskkonna poole välja toodule, et rakendus ei ole veel täiesti viimistetud ei oodanud testija täisfunktsionaalust, kuid esilehel oleks ehk oodanud minimaalset informatsiooni projekti olemusest.

Rakenduse funktsionaalsus

Kuna retsensioon keskendub projekti teenuse osale, siis antud juhul on tähelepanu kasutajaliidese visuaalsele ja funktsionaalsele osale pööratud minimaalselt. Kasutajaliidest kasutab testija ainult niipalju, et anda hinnang teenusele. Peale peakasutaja (admin@admin.ee) loomist ilmus palju intuitiivsem kuva võrreldes esilehega.

Teenus

Esmapilk teenusepoolsele koodiosale annab üsna selge ülevaate, kus midagi asub ja milleks on midagi on loodud. Õppeprogrammis esile toodud meetodeid on samuti rakendatud. Tundub, et meeskond ei ole projekti kavandades valinud kõige minimaalsemat funktsionaalsust vaid tundub, et on soovitud realiseerida ka väljaspool antud õppekava rakendatavat lahendust. Koodist on näha, et on kasutatud EntityFramework ja nn code first lähenemist, kus esmalt on kirjeldatud olemid ja nende vahelised seosed. Uurides SQL Server Object Explorer’ga andmebaasi “NutiHoone”, siis kuue olemi nõue on täidetud. Uurides tabeleid, siis selgub, et on kasutatud andmebaasi tasandil tabelite vahelisi seoseid, mida antud õppeaine ühe osana propageerib. Olemite nimed, mis andmebaasi tabeliteks on genereeritud, on arusaadavate nimedega ja ülevaatlikud. Testija pani tähele, et oli jäetud realiseerimata õppejõu poolt rangelt soovitatud atribuudid olemitele – created ja modified. Koodi läbivaatamisel oli näha, et koodi on minimaalsel määral kommenteeritud. Testija subjektiivne arvamus on, et kui koodi üldse kommenteerida, siis peaks seda tegema inglise keeles. VisualStuudio lisab vaikimisi ka oma kommentaarid, siis antud stiili jätkamine oleks teretulnud.

Teenuse uurimisel selgus, et andmevahetusteenusena kasutatakse REST meetodit.

Teenuse koodiosa analüüsimine näitab, et projektimeeskond on rakendanud õppeaines tutvustatud metoodikat, kus kirjeldati, kuidas äriloogika ja andmevahetuskihid teineteisest eraldada. On näha, et andmeid kontrolleris initsialiseeritakse objekt, mis läbi “Interface” pakuvad meetodeid, mis realiseerivad vajalikud CRUD (Create, Read, Update, Delete) meetodid.

Testija pani tähele, et DTO (Data Transfer Object) osas oli mudelite juurde sisse jäetud “virtual” võti, mida retsensiooni kirjutaja, arvestades tema teadmiste pagasit, peab üleliigseks, kuna antud võtit kasutatakse ainult “Entity Framework” raamistikus objektidest andmebaasitabelite ja nende vaheliste seoste loomiseks. Samas on näha, et DTO kihti ei kasutata ainult seepärast, et antud metoodika oli rangelt soovitatav vaid kasutatakse ka reaalselt näiteks klassis “PersonDTO”, kus klassi omadus “FullName” realiseeritakse kahe klassi teise omaduse “FirstName” ja “LastName” abil, mida küll VisualStudio arust keegi ei kasuta. Samas tekitas küsimust, miks mõned DTO klassid on tühjad. VisualStudio omadust, mis näitab antud klassi seotust kasutades selgub, et DTO klassi “ZoneDTO” ei kasuta projektis keegi. Samuti leidis testija kasutamata meetodeid “ObjectFactory” osas.

Kokkuvõtte

MicroSoft poolt pakutavat arendusvahendit VisualStuudio on targalt ja võimalikult palju ära kasutatud. Nagu ka projekti meeskonna poolt välja on toodud, on projektis veel palju viimistlemist. Samas on realiseeritud antud aine käigus esile toodud olulisemad metoodikad. Vähese kogemusega testija sai projekti paigaldamise ja kasutamisega hakkama. Kindlasti ei ole lahendus veel päris valmis, kuid annab piisava ülevaate funktsionaalsusest.

Retsensioon klientrakenduse kohta

Alljärgnevas on retsenseeritud meeskonna HMR klientrakendust.

Nimetatud rakendus on ehitatud sama meeskonna poolt loodud veebiteenusele.

Rakendus on töötav ning täidab valdavas osas talle projekti analüüsiga seatud eemärke. Paraku ei saanud me hinnata kogu funktsionaalsust. Näiteks ei ole me proovinud sensorite olekute ning valve sisse-välja lülitamist, kuna lahendusega ei ole kaasas töötavat testsüsteemi , mis seda võimaldaks - puuduvad reaalsed sensorid mille suhtes seda teenust katsetada.

Klientrakendus on ülesehitatud kasutama JSON-it. Sellist lähenemist võiksime retsensentidena ka kahtluse alla seada, kuna leiame, et praegusel juhul oleks olnud ehk mõistlikum kasutada SOAPi. Seda just seetõttu, et sellisel juhul poleks olnud vajalik DLL kloonimine klientrakenduse poolel ning vaated ja kontrollerid saaks luua otse veebiteenusele toetudes. Lisaks leiame, et antud rakenduse puhul on iga veebiteenuse muudatuse korral keerulisem otsida muudetud osasid ja neid veebiteenusega vastavusse viia. JSONi kasutamist peame mõistlikuks väga suurte andmehulkade või väga tiheda andmevahetuse puhul. Kumbki tingimustest antud juhul ei kehtinud - olemeid on küll palju kuid info maht väike ja tihedus madal.

Muus osas on kood loogiliselt üles ehitatud, korrektselt liigendatud projektidesse ja kaustadesse.

Piirsituatsioonidega on üldjuhul arvestatud. Leiame, et veahaldus on hästi lahendatud läbi selle, et on ära kasutatud .net raamistiku autentimise võimalusi. Seetõttu ei ole olud vajalik eraldi valideerimine.

Koodi kommentaarid on väga üldised või genereeritud automaatselt „auto-generated“.

Kasutajamugavuse ja UI seisukohalt üldiselt, võiks meie hinnangul esimest korda sisenedes olla avaaknas kuvatud kas mingi tutvustav tekst või kasutaja loomise aken. Selle asemel on kuvatud juba rakenduse osaline sisu (tavakasutaja vaade).

Positiivne on, et registreerimisel ja sisselogimisel kontrollitakse e-maili või salasõna korrektsust (toimib veahaldus).

Pärast sisselogimist on taas esmane vaade üsna arusaamatu. Soovitus oleks suunata kasutaja sisselogimise järgselt lehele, kus kuvataks lahenduse kasutamist puudutav sisuline dokumentatsioon.

Leiame, et lahenduse kasutamisel võib tekib probleeme, kuna ei ole selge, kus nupu/valiku all mingi sisestus peaks toimuma. Samuti on arusaamatu millises järjekorras tuleks neid sisestusi teha, s.t. mis sisestus, millega seotud on. Näiteks intuitiivselt tahaks esimesena sisestada ruumi, samas aga selgub, et enne ruumi sisestamist oleks maja pidanud olema eelnevalt sisestud. Tavakasutajale jäävad arusaamatuks jäävad selliste vahetabelid: „SensorTypes“, „SensorsInRooms“, „ActivityType“ ja „User in Roles“.

Selleks, et kasutaja saaks enda jaoks töötava lahenduse kokku panna (oletame, et üles ehitada ühe maja sensorite süsteem) läheb väga palju aega, sest ei ole olemas mingit etalon-profiili, mille pealt sellist ehitamist oleks lihtsate muudatuste kaudu võimalik teha.

Seega, kasutusmugavuse seisukohast ning eelnevale viidates, olekski arendajatele ettepanek muuta klientrakenduse loogilist struktuuri näiteks järgmiselt:

- selle asemel, et lasta kasutajal ise luua olemid ja nende vahelised seosed n.ö. nullist oleks mõistlik kasutada profiili põhist lähenemist.

- selle asemel, et anda kasutajale võimaluse iga uue olemi kirje loomiseks eraldi lehel, võiks toimuda kogu maja ruumide ja sensorite kirjeldus ühel lehel.

- selle asemel, et anda kasutajale valik uu(t)e sensori(te) loomiseks võiks olla andmebaasis kirjeldatud valik sobivatest ( vastavad enumid juba veebirakenduses).

Kokkuvõtteks võib märkida, et arvestades valitud ülesande ambitsioonikust on suudetud põhifunktsionaalsused siiski täita. Osasid analüüsis välja toodud funktsionaalsusi ei saanud aga kontrollida testsüsteemi puudumise tõttu. Parandamist vajaks kindlasti rakenduse kasutusjuhend ja tavakasutajale raskesti mõistetav loogiline ülesehitus (olemite loomine).

XML andmefail

XML fail

<?xml version="1.0" encoding="UTF-8" ?>

<people xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com people.xsd">

	<person id="37303140314" age="41" sex="M">
		<fname><![CDATA[Margus]]></fname>
		<lname><![CDATA[Roo]]></lname>
		<email><![CDATA[margus@roo.ee]]></email>
		<phones>
			<phone status="active" number="+3725148780"/>
			<phone status="active" number="+3725148781"/>
			<phone status="unactive" number="+3725148784"/>
		</phones>
	</person>
	<person age="31" sex="M" id="38209064511">	
		<fname><![CDATA[Tõnis]]></fname>
		<lname><![CDATA[Luik]]></lname>
		<email><![CDATA[tonisluik@hotmail.com]]></email>
		<phones>
			<phone status="active" number="+3725148786"/>
			<phone status="active" number="+3725148787"/>
			<phone status="unactive" number="+3725148788"/>
		</phones>
	</person>
	<person age="32" sex="F" id="48209064522">
		<fname><![CDATA[Silja]]></fname>
		<lname><![CDATA[Saar]]></lname>
		<email><![CDATA[silja.saar@live.com]]></email>
		<phones>
			<phone status="active" number="+3725148111"/>
			<phone status="active" number="+3725148222"/>
			<phone status="unactive" number="+3725148333"/>
		</phones>
	</person>
	<person age="32" sex="M" id="38209164533">
		<fname><![CDATA[Ott]]></fname>
		<lname><![CDATA[Kingisepp]]></lname>
		<email><![CDATA[ott.kingisepp@gmail.com]]></email>
		<phones>
			<phone status="active" number="+3725118711"/>
			<phone status="active" number="+3725128722"/>
			<phone status="unactive" number="+3725128733"/>
		</phones>
	</person>
</people>

XML skeemifail

<?xml version = "1.0" encoding = "UTF-8"?>
<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema">

  <xsd:element name = "people">
   <xsd:complexType>
    <xsd:sequence>
     <xsd:element ref = "person	" maxOccurs = "unbounded"/>
    </xsd:sequence>
   </xsd:complexType>
  </xsd:element>

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="fname" type="xs:string"/>
      <xs:element name="lname" type="xs:string"/>
      <xs:element name="email" type="xs:string"/>
	  <xs:element name="phone">
  	  	<xs:complexType>
    		<xs:sequence>
      			<xs:element name="number" type="xs:string"/>
    		</xs:sequence>
    		<xs:attribute name="status	" type="xs:string" use="required"/>
  		</xs:complexType>
	</xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="xs:int" use="required"/>
    <xs:attribute name="age" type="xs:int" use="required"/>
    <xs:attribute name="sex" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

XSLT failid

HTML [2]

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html"/>
	<xsl:template match="/" >
		<htm>
		<head>
			<title>Persons database</title>
		</head>
		<body>
		<xsl:for-each select="people/person">
			<p><xsl:value-of select="concat(position(),' - ',fname,' ',lname)"/></p>
			<p>ID: <xsl:value-of select="@id"/></p>
			<p>Age: <xsl:value-of select="@age"/></p>
			<p>Sex: <xsl:value-of select="@sex"/></p>
			
			<p>Phones</p>
			<xsl:for-each select="phones/phone">
				<p><xsl:value-of select="@number"/></p>
			</xsl:for-each>
			
			<hr/>
		</xsl:for-each>
		</body>
		</htm>
	</xsl:template>
</xsl:stylesheet>

HTML 2 [3]

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html"/>
	<xsl:template match="/" >
		<htm>
		<head>
			<title>Persons database</title>
		</head>
		<body>
			<h2> Meesterahvad </h2>
				<table border='1'>
					<tr bgcolor="#BFBFBF">
					  <th>Eesnimi</th>
					  <th>Perenimi</th>
					  <th>Sugu</th> 
					 </tr>
						<xsl:for-each select="/people/person[starts-with(@id, '3')]">
						<xsl:sort select="lname" order="ascending" />
						<tr>
							<td><xsl:value-of select="fname"/></td>
							<td><xsl:value-of select="lname"/></td>
							<td><xsl:value-of select="@sex"/></td>        
						</tr>
				
						</xsl:for-each>
				</table>	
		</body>
		</htm>
	</xsl:template>
</xsl:stylesheet>


Veebiteenuse analüüs

Teenus võimaldab hallata sõidupäeviku andmebaasi. Samuti kontrollib teenus kasutaja õigust teenust kasutada:

  • Kas kasutaja ja tema salasõna ühtivad
  • Hoiab kasutaja tegevuste kohta statistikat
  • Kasutaja tegi ühe CRUD tegevustest

Veebiteenus pakub SOAP tüüpi WSDL kirjeldusfailiga tutvustatud teenuseid, millede kaudu on võimalik pöörduda C# keeles koostatud objektide poole. Objektid pakuvad CRUD meetodeid objektile: Company, User, Car, Usage, BindUserCarCompany, Usage, ServiceUser. Vastavate objektide atribuutid salvestatakse andmebaasi.

Olemid

Company

  • attributes: id, name, created, modified
  • methods: add, modify, delete

Car

  • attributes: id, name, created, modified
  • methods: add, modify, delete

User

  • attributes: id, name, created, modified
  • methods: add, modify, delete

Usage

  • attributes: id, name, created, modified
  • methods: add, modify, delete

BindUserCarCompanyUsage

  • attributes: user, car, company, usage, created, modified
  • methods: add, modify, delete

ServiceUser

Tuleneb nõudest kasutajate halduse ja piirangute haldamisest

  • attributes: id, username, password, maxAllowedAccess, accessCounter, created, modified
  • methods:add, modify, delete

Antud iteratsiooni tulemusena tekib:

  • Kirjeldatud veebiteenuse pöördumispunkt
  • WSDL
  • C# keeles realiseeritud CRUD meetodid olemitele
  • Admebaas olemite atribuutide hoidmiseks

Veebiteenus

http://margus.roo.ee/SPWcfServiceLibrary_final.zip

Siin zipis VS2013 solution. Avada SPWcfServiceLibrary.sln ja panna startup projectiks SPWcfServiceHost. Seejärel panna käima ilma debuggimiseta.

Klientrakendus

http://margus.roo.ee/WebAppForSP_final.zip

Siin on klientrakendus koos admin paneeliga. Tõmmata alla ja käivitada WebAppForSP.sln. Kui on "credentialite" probleeme, siis esmalt teha Teenusele "Update Service Reference" ja seejärel läbida see (https://wiki.itcollege.ee/index.php/Praktikum:_Windows_Communication_Foundation_teenuse_turvamine,_VR2.9 ) juhend.

Projekti dokumentatsioon

Projekti dokumentatsioon [4] sisaldab nii veebiteenuse kui klientrakenduse funktsionaalsuse ja arendusprotsessi kirjeldust ning kasutajajuhendit.