Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Varför krångla till det?

Postades av 2006-11-20 12:53:52 - Per Persson, i forum systemutveckling generellt, Tråden har 18 Kommentarer och lästs av 1615 personer

Detta är ett utdrag ur en klass som jag hittade i ett exempel för Wilson ORMapper:

public class Category
{
    private int id;
    private string name;
    private string description;

    public int Id {
        get { return this.id; }
    }

    public string Name {
        get { return this.name; }
        set { this.name = value; }
    }

    public string Description {
        get { return this.description; }
        set { this.description = value; }
    }
}


Varför skriver man så i stället för följande betydligt kortare kod?
public class Category
{
    public readonly int id;
    public string Name;
    public string Description;
}


Svara

Sv: Varför krångla till det?

Postades av 2006-11-20 15:01:30 - Per Hultqvist

Exemplet är ju lite trivialt, set-konstruktorn är ju bra ställe att utföra valideringar av datat. I get kan man ju implementera "lazyloads" av underobjekt (har jag för mig att det brukar kallas av de som är lite mer insatta än jag i arkitektur).

En annan grej kan ju vara att man vill sätta en flagga när ett värde ändras, eller kanske trigga ett event. Det är ju lätt fixat i set.

   public Customer Customers
   { 
       get { if (m_Customers==null)
               {
                   m_Customers=new Customers();
                   m_Customers.Load();
                }
                return m_Customers;
             }
    }

    public int Age
    {
        get { return mAge; }
        set { if (mAge>150 || mAge<0)
                   throw new ArgumentException("Invalid age!!");
               mAge=value;
              }
    }


Svara

Sv:Varför krångla till det?

Postades av 2006-11-20 15:26:18 - Per Persson

Det är inte sådana fall jag vänder mig mot, utan just dessa "rena" get och set. Där ser jag ingen mening med att använda dem.

(Om språket inte erbjuder get- och set-konstruktioner, utan man är tvungen att skapa metoderna getXXX() och setXXX(), kan jag däremot acceptera det.)


Svara

Sv: Varför krångla till det?

Postades av 2006-11-20 17:49:34 - Oskar Johansson

En gissning: En massa kod kompilerad mot din dll måste inte nödvändigtvis kompileras om bara för att du ändrar från en variabel till en egenskap för att du måste kontrollera värdet i set-metoden? ;)


Svara

Sv:Varför krångla till det?

Postades av 2006-11-21 00:10:56 - Per Persson

Kanske det... Hur mycket behöver kompilatorn veta om en klass A som används av en annan klass B för att filen som klass B ligger i skall kunna kompileras? Behöver kompilatorn veta om a.x är en direkt åtkomst av attributet x eller om det sker via get/set?


Svara

Sv: Varför krångla till det?

Postades av 2006-11-21 00:11:58 - Ola Lindfeldt

Det är ju som PH skriver vanligt att man vill göra nåt i set-operationerna typ validera, eller skapa nåt i get-operatorerna t.ex ett objekt som måste hämta från db t.ex..
En annan fördel är att du kan stoppa in felhantering med try, catch... t.ex. är du väl glad för att Grid.Datasource=BitmapImage talar om för dig vad som är fel i stället för att krascha med nåt skumt fel som inte säger nåt... Det är snyggt att ha samma tänk i ett affärslager.. t.ex. P.PersonNr = "aaa" ger ApplicationException "ej korrekt personnummer"....

genom att alltid använda Properties (get/set) så följer man ett mönster och all din kod blir konsekvent. Och i det här fallet är ju koden skapad av en generator så det drabbar ju ingen människa att skriva de här extra raderna. (men det underlättar för dig om du vill bygga vidare på den genererade koden).
Men det finns ju ingen lag som säger att du måste göra så.. :) Dock är det enligt min erfarenhet ganska vanligt att om man har "slarvat" och inte använt properties då kommer man ofta till den punkt där man behöver några properties ändå... och då kommer man störa sig på att det är lite blandat och allmänt rörigt, och göra om allt till props... (Eller så kodar man konsekvent och koncentrerar sig på de verkliga problemen man ska lösa.. :)








Svara

Sv: Varför krångla till det?

Postades av 2006-11-21 08:41:40 - Simon Dahlbacka

<b>Behöver kompilatorn veta om a.x är en direkt åtkomst av attributet x eller om det sker via get/set?</b>
I .NET behöver den det, en property get görs i IL som

callvirt get_propertyName()


Svara

Sv:Varför krångla till det?

Postades av 2006-11-22 00:04:54 - Per Persson

<b>Det är ju som PH skriver vanligt att man vill göra nåt i set-operationerna /.../</b>
<b>En annan fördel är att du kan stoppa in felhantering med try, catch /.../</b>

Som jag försökte säga ovan är det inte dessa fall jag undrar över, utan bara de där man lika gärna kunde ha tilldelat fältet direkt.


<b>Och i det här fallet är ju koden skapad av en generator så det drabbar ju ingen människa att skriva de här extra raderna.</b>

<b>Dock är det enligt min erfarenhet ganska vanligt att om man har "slarvat" och inte använt properties då kommer man ofta till den punkt där man behöver några properties ändå... och då kommer man störa sig på att det är lite blandat och allmänt rörigt, och göra om allt till props...</b>

Okej, detta, tillsammans med att API för IL blir olika, övertygar mig om att jag skall acceptera sådan kod, även om den vid första anblicken ser onödigt omständlig ut.


Svara

Sv: Varför krångla till det?

Postades av 2006-11-23 08:50:52 - Marcus Gus

<b>Som jag försökte säga ovan är det inte dessa fall jag undrar över, utan bara de där man lika gärna kunde ha tilldelat fältet direkt.</b>

I vissa fall fungerar det inte att tilldela direkt utan man måste göra det via properties, har för mig att XML-seraliseringen i .Net kräver properties tex.


Svara

Sv: Varför krångla till det?

Postades av 2006-11-25 21:42:28 - jonas ekenberg

Den största anledningen till varför man skall använda sig av setters och getters är att man då följer OOP-paradigmen inkapsling. Det är inte bra att en klass visar sina attribut publikt. Att låta andra objekt peta i andras objektsattribut obehindrat kommer att medföra stora problem i längden. Betänk en felsökning.


Svara

Sv:Varför krångla till det?

Postades av 2006-11-25 22:34:13 - Per Persson

Jag tror inte du förstod vad det var jag ifrågasatte...


Svara

Sv: Varför krångla till det?

Postades av 2006-11-26 10:12:29 - Roger Alsing

Jag är rätt säker på att det bara handlar om best practices och inget rent tekniskt i Wilsons fall.
han injectar ingen kod i runtime och det vore väldigt lätt att skriva kod som går mot både properties o fält.

Men enligt alla .NET designdokumnet så ska man alltid ha properties om man vill exponera ut värden.
(tror tex kod analyzern i vs2005 kommer gnälla på att du har publika fält, ms FXcop gör det iaf)

//Roger


Svara

Sv:Varför krångla till det?

Postades av 2006-11-27 10:54:22 - Martin Adrian

>följer OOP-paradigmen inkapsling.

Inkapsling bygger på att man skall dölja hur objektet fungerar internt. Jag tycker det vanligaste sättet att använda Setters & getters är raka motsatsen?


Svara

Sv: Varför krångla till det?

Postades av 2006-11-27 12:42:06 - Ola Lindfeldt

Martin, hur menar du då? det är ju främst inkapsling det handlar om.


Svara

Sv:Varför krångla till det?

Postades av 2006-11-27 12:59:33 - Per Persson

Väldigt ofta ser man att folk i första hand verkar ha funderat över vad objektet skall innehålla och sedan skapat getters och setters eftersom de har lärt sig att man skall ha det. När de sedan upptäcker att objektets innehåll behöver ändras måste de ändra interfacet och alla ställen i koden där detta används.

I stället skall man i första hand fundera över interfacet, och sedan sätta innehåll efter detta.


Svara

Sv:Varför krångla till det?

Postades av 2006-11-27 15:54:36 - Martin Adrian

>Martin, hur menar du då? det är ju främst inkapsling det handlar om.

Jag tycker inte det är särskilt inkapslat om interfacet bygger på vilka medlemmar klassen har för tillfället. Om du av någon anledning behöver ändra innehållet kommer ju också interfacet att ändras.

Nu har jag iochförsig alltid haft svårt för skrivbara egenskaper så setters tycker jag bara krånglar till det.
Dessvärre så verkar utvecklingen gå mer och mer mot att man har en tom konstruktor och sen bygger objekten med properties så det är väl bara att anpassa sig.


Svara

Sv: Varför krångla till det?

Postades av 2006-11-27 17:13:04 - Ola Lindfeldt

Martin, varför blandar du in interface. Properties (get/set) är det sätt som man implementerar inkapsling av klassernas egenskaper. Det har inget med Interface att göra.


Svara

Sv:Varför krångla till det?

Postades av 2006-11-27 17:59:20 - Per Persson

Både jag och Martin blandade in ordet "interface", men jag - och inte heller Martin skulle jag tro - pratar om konstruktionen Interface som finns i C#. Det handlar om gränssnittet man har till klassen, vilka metoder och attribut som syns utåt. Det vill man skall vara oförändrat och naturligt. Konstruktionen Interface har delvis med detta att göra, men närmast som specialfall.


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
689
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies