Announcement

Collapse
No announcement yet.

Grundsaätzliche Frage zu Enums

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Grundsaätzliche Frage zu Enums

    Hallo zusammen,
    ich habe da im Moment nen kleines Problem, bzw. ich stehe da nen bischen auf`m Schlauch....

    Ich benötige ein Enum, in welchem sich die Elemente immer um eine Zweierpotenz erhöhen sollen.
    Wenn ich das jetzt richtig verstehe sind da meine Grenzen so wieso bei 2 Hoch 62.
    Also 63 Elmente.

    Ich muss im schlimmsten Falle alle Werte der Elemente zusammen addieren und im SQL-Server 2000 speichern.

    Habe ich eine Chance mit mehr als diesen 63 Elementen zu arbeiten, Wie ?

    Schon mal Danke für Eure Hilfe....

  • #2
    Hallo,

    wie kommst du auf 62?

    Mehr als 63 Elemente geht, nämlich 64
    Code:
    [Flags()]
    public enum MyEnum : ulong
    {
    	Alle = 0,
    	Enum1 = 1,
    	Enum2 = 2,
    	Enum64 = 18446744073709551615
    }
    Das Flags-Attribut wird verwendet um ein bitweise Kombination zu ermöglichen.

    Sollen es noch mehr als 64 sein könntest du eine Datentyp entwerfen der größere Ganzzahlen darstellt.

    Einfacher ist jedoch wenn die Flags (1 und 0) in einem Char-Array oder String gespeichert werden. Das setzen/lesen erfolgt über die Indexposition.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Ick koome auf 62, wenn ich

      Code:
      Public Enum MyEnum as long
      '...
       MyValue = CType(2 ^ 63, Long)
      '...
      end Enum
      eingebe bekomme ich folgende Fehlermeldung:
      Der Konstantenausdruck ist im Typ Long nicht reprensentierbar.

      Sollen es noch mehr als 64 sein könntest du eine Datentyp entwerfen der größere Ganzzahlen darstellt.
      Wie mache ich so etwas, habe ich noch nie gemacht...


      Einfacher ist jedoch wenn die Flags (1 und 0) in einem Char-Array oder String gespeichert werden. Das setzen/lesen erfolgt über die Indexposition
      Dies Verstehe ich ebenfalls nicht, ich muss mit den Zahlen evtl. weiter rechnen, wie soll ich mit nen Char rechnen...?

      Comment


      • #4
        1. Long geht nicht bis 2^63, denn es sind ja auch negative Werte dabei, deshalb ulong -> nur positive -> geht bis 2^64
        2. wenn du mit den Zahlen weiterrechnen willst musst du sowieso einen eigenen Datentyp entwerfen der mehr Kapazität als ulong hat.


        Bist du dir sicher dass deine Enum als Bitfeld realisiert werden muss? Bei einer gewöhnlichen Enum können die Elementwerte beliebig sein, nur beim Flags-Attribut müssen es 2er-Potenzen sein.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Genau das ist es ich benötige ein Flag Enum...

          Kannst du mir da weiterhelfen, wie ich da ran gehen muss..?

          Comment


          • #6
            ich muss mit den Zahlen evtl. weiter rechnen,
            Code:
            if (weiterrechnen)
                eigener Datentyp -> aufwändig
            else
                string -> und Positionen mit 1 oder 0 besetzen
            Zuerst muss diese Frage geklärt sein, denn es gibt dann einen grundsätzlichen Unterschied in der weiteren Vorgehensweise.

            Wenn ich das weiß werde ich ein Bsp basteln.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Also was ich mache:

              Ich benötige ein "Berechtigungssystem"

              Da ich durch Addition von Zweierpotenzen immer eindeutige Zustände bekomme nutze ich diese Vorgehensweise.

              Ich addiere also die "Flags" und speichere diese in eine Datenbank

              Beim Auslesen durchlaufe ich eine rekursive Schleife um auf den Ausganszustand "Berechtigung" zu kommen.

              Es kann durchaus vorkommen das ich in einem Projekt mehr als 64 definierte Zustände benötige...

              Das erst mal zu meinem Problem...

              Comment


              • #8
                Berechtigungssystem
                Dazu gibts es besser Möglichkeiten als mit Enums zu arbeiten.

                Kurzbeschreibung eines Verfahrens: http://www.it-visions.de/glossar/all...ol%20List.aspx
                Das in Code umsetzen und fertig.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Die machen scheinbar nichts anderes wie ich auch:

                  - AccessMask: Die AccessMask definiert die Rechte. Für jeden Objekttyp gibt es unterschiedliche Rechte. Jedes Recht ist dabei ein Bit bzw. eine Kombination von Bits in diesem Long-Wert. Eine AccessMask besteht in der Regel aus der Addition mehrerer einzelner Zugriffsrechte.

                  Comment


                  • #10
                    Ja, aber denk weiter.

                    Welche Rechte willst du für eine Resource vergeben - Zugriff ja/nein?
                    Dann hast du eine Liste mit den Benutzern und eine mit den Resourcen - dies entspricht dann einer Matrix in der die Werte für den Zugriff gespeichert sind (also ja oder nein).

                    Somit ist kein Enum nötig und die Größe der Matrix ist auch nicht beschränkt (aus durch die Hardware-Voraussetzung).

                    Sollte noch mehr Rechte als ja/nein nötig sein dann kommt eine Enum ins Spiel. Ich bin mir aber sicher dass du keine 64 verschiedenen Rechte brauchst.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Stell dir vor du baust ein Projekt mit sagen wir mal 30 Forms.
                      Für jede Form soll eine Berechtigung lesen - schreiben - nicht sichtbar deklariert werden.

                      Das heißt also ich habe für jede Form 3 Zustände.
                      Das mach bei 30 Form schon 90 Zustände.

                      Jetzt soll evtl. das drucken eines Berichts explizit frei oder nicht freigegeben werden....

                      Also, dass summiert sich....

                      Und da kommt dann normalerweise meine Deklaration meines Enums ins spiel...

                      Comment


                      • #12
                        Ah, das hast du nicht verstanden.

                        Du hast eine Enum:
                        Code:
                        [Flags()]
                        public enum Berechtigung
                        {
                            lesen = 1,
                            schreiben = 2,
                            unsichtbar = 4
                        }
                        Desweiteren hast du eine Matrix deren Zeilen deine Benutzer sind und deren Spalten deine Objekt (30 Forms) sind. In jedes Element der Matrix werden die Rechte als bitweise Kombination der Enum eingetragen. Somit ist für einen bestimmten Benutzer genau geregelt was er mit dem Objekt (der Form) machen kann.

                        Dies in Code umzusetzen ist trivial.

                        mfG Gü
                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                        Comment


                        • #13
                          das hieße aber ich müßte für die Datenbank ein relationales System aufbauen um für jeden User die abhängigen Rechte der Forms zu speichern..??
                          Oder ??

                          Bis jetzt gibt es in der Datenbank nur eine Tabelle mit zwei Feldern. User und Berechtigungen. Wobei in Berechtigungen der Wert aus der Addition meiner Enums steht...

                          Comment


                          • #14
                            Die Matrix könnte auch binär serialisiert werden und so auf die Datenbank verzichtet werden. Ist ev. sogar sicherer denn der Schutz funktioniert auch ohne Verbindung zur DB - hängt aber von deiner Anwendung ab.

                            Sonst muss die Matrix entsprechend in Tabellen gewandelt werden.

                            mfG Gü
                            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                            Comment


                            • #15
                              Mit dem Projekt ist so wieso eine Datenbank im Einsatz.

                              Die Berechtigungen sollen jederzeit flexibel angepasst werden. Also benötige ich die Speicherung in eine Datenbank.

                              Da ich bis jetzt Projekte kleiner 20 Forms hatte, stellte die Speicherung und Auswertung per Enum kein Problem dar.

                              Wenn ich nun die Berechting so wie du das vorschlägst projektieren würde, wäre das schon ein riesen Aufwand. ich müßte die Datenbank umbauen und das VB-Projekt anpassen.

                              Aus diesem Grund wäre mir schon lieber, wenn ich nur das VB-Projekt anfassen müßte...

                              Comment

                              Working...
                              X