myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Code aus Klasse ausgliedern
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Code aus Klasse ausgliedern

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
adhome
myCSharp.de-Mitglied

Dabei seit: 08.02.2020
Beiträge: 3


adhome ist offline

Code aus Klasse ausgliedern

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich hab mal eine Verständnisfrage zum Objektorientiertem Programmieren.
Vielleicht fehlt mir auch eine Technik.

Ich habe eine Klasse "Class1". Diese hat Member Variablen wie "mVar1" die von der aufrufenden Instanz initialisiert wurden und mit der nun die Klasse rumrechnen soll.
Es gibt aber viel Code und tausende Unterfunktionen und die Klasse wird sehr lang.
Ich dachte die vielen Unterfunktionen in Module auszulagern.
Nur wie greife ich nun von den Unterfunktionen in den Modulen auf die Variable mVar1 zu ohne die Objektinstanz umständlich immer weiter runter (tiefer) zu führen.

Kenne "Partial" womit ich die Klasse auf mehrere Dateien aufteilen kann.

Falls ich Klassen statt Module verwenden sollte, wie greife ich dort auf mVar1 besten zu?
Ich vermute mit runter reichen oder so.... Sieht aber alles recht umständlich aus.

Danke (;
Neuer Beitrag 08.02.2020 11:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.575
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo.

Zitat von adhome:
Diese hat Member Variablen wie "mVar1" die von der aufrufenden Instanz initialisiert wurden und mit der nun die Klasse rumrechnen soll.

Bitte keine Angewohnheiten aus anderen Sprachen in C# mitnehmen; das endet meist unglücklich.
In C# haben Variablennamen weder den Typ noch den Zugriffscontext enthalten.
"mVar" ist also fehl am Platz.

Siehe auch  [Artikel] C#: Richtlinien für die Namensvergabe
Die ganze Community von C# orientiert sich weltweit an den Richtlinien von C#.
Es ist daher sehr praktisch und macht auch die Zusammenarbeit viel einfacher.

Daher bitte nimm nichts spezifisches aus C++ oder Delphi etc mit.

Zitat von adhome:
Es gibt aber viel Code und tausende Unterfunktionen und die Klasse wird sehr lang.
Ich dachte die vielen Unterfunktionen in Module auszulagern.

Auch hier; bitte nicht die Wege von anderen Sprachen 1:1 blind übernehmen.

Es bleibt Dir prinzipiell nichts anderes übrig als Dich mit OOP und den C# Sprachwerk zu beschäftigen.
Deine Fragen können im Prinzip nicht so einfach pauschal beantwortet werden.

Viel eher solltest Du Dich an Pattern und Prinzipien halten; zB KISS.
Es gibt keine Regel die besagt "ab 57 Zeilen musst Du die Klasse oder Methode splitten".

Zitat:
Kenne "Partial" womit ich die Klasse auf mehrere Dateien aufteilen kann.

Wenn Du partial wegen der Größe von Dateien verwendest, dann machst Du was falsch.
Der Urpsrung besteht darin, dass zB mit DSL-Tools wie T4 man C# Code generieren kann; also automatische Code Generierung.
Dieser automatisch generierte Code kann aber nicht bearbeitet werden, weil alle Änderungen beim nächsten Durchlauf natürlich überschrieben werden.
Mit partial hat man nun die Möglichkeit einen generierten Code zu "erweitern", ohne, dass bei einem neuen Durchlauf der generierte Code alles überschreibt.

Zitat:
Nur wie greife ich nun von den Unterfunktionen in den Modulen auf die Variable

In C# gibt es den Begriff eines "Moduls" nicht; daher kann ich Dir nicht folgen, was Du meinst.

Wenn Du sehr viel "reichst", dann hört sich das nicht so an, dass Du Architektur von Software 100% verstanden hast und wie man Pattern anwendet.
Das basiert prinzipiell aber auch auf viel Erfahrung; und dazu gehört auch viel ausprobieren und falsch machen.

Daher mein Tipp:
- Beschäftige Dich wirklich damit wie C# funktioniert
- Schau Dir wirklich OOP an
- Beachte Grundpattern wie die 3 Schicht Architektur, Gang of Four und Prinzipien wie  KISS-Prinzip, DRY/DIE, SOLID etc..
Neuer Beitrag 08.02.2020 12:37 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.503
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Um was für eine konkrete Klasse handelt es sich, daß sie "tausende Unterfunktionen" hat? Dies dürfte wohl ein genereller Design-Fehler sein.

Üblicherweise sollte eine Membervariable nur von sehr wenigen Methoden aus beschrieben werden, so daß es reicht, diese in eine eigene Klasse auszulagern und zusätzlich einen Getter für diese Membervariable anzubeiten.
Also statt

C#-Code:
class LangeKlasse
{
  Type mVar;

  // ganz viele Methoden
  // ...
}

erzeugst du eine eigene Klasse

C#-Code:
class MyVarClass
{
   Type mVar;

   public Type Var { return mVar; } // bzw. gleich als Type Var { get; private set; }

   // nur relevante Methoden, welche mVar beschreiben
   // ...
}

und bindest diese dann in deine Hauptklasse ein (und greifst dann - falls erforderlich - mittels des Getters auf die Membervariable zu).
Neuer Beitrag 08.02.2020 12:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
adhome
myCSharp.de-Mitglied

Dabei seit: 08.02.2020
Beiträge: 3

Themenstarter Thema begonnen von adhome

adhome ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Abt: Super. Vielen Dank. Ich glaube du hast verstanden, wo mein Problem ist.
Ich hab irgendwie noch eine falsche Denkweise....

@Th69: Vielleicht ein plastischeres Beispiel:
Klasse Auto hat Instanzen der Klasse Autositz und Fahrer.
Nun will die Klasse Autositz rausfinden welcher Fahrer gerade im Auto ist.
Er müsste somit die Klasse Auto fragen. Nur wie greift Autositz auf Auto zu, wenn es nicht sowas wie eine Parent Eigenschaft gibt.

Bei Klassenstruktur hab ich sowas wie eine Baumansicht im Kopf. Nur fehlen die Parent Befehle um auf die Parents zuzugreifen...

Beim Ableiten gibts ja BASE.
Neuer Beitrag 08.02.2020 14:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 287
Herkunft: Köln


KroaX ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In der Regel kannst du sowas über einen Bounded Context bzw. Aggregates lösen.

Es ist nicht so als müsste dein Autositz jemanden fragen wer der Fahrer ist, viel mehr müsste dein Auto mitbekommen wenn der Fahrer gewechselt wird ( oder wo auch immer ) und diese Information auch sofort an den Autositz weitergeben. Somit bleibt die Zuständigkeit beim Fahrerwechsel ganz eindeutig beim Auto.

Schau dir am besten die Thematik zum Domain Driven Design an und ergänzend kann ich außerdem das Prinzip des Data Oriented Design empfehlen.
Neuer Beitrag 08.02.2020 16:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.503
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@adhome: Du kannst dir auch mal meinen Artikel  Kommunikation von 2 Forms durchlesen (da geht es aber auch generell um die Kommunikation zwischen 2 oder mehreren Klassen) - bes. den Abschnitt "Lösung: Verwendung von Eigenschaften (Properties) und Ereignissen (Events)".
Neuer Beitrag 08.02.2020 17:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
adhome
myCSharp.de-Mitglied

Dabei seit: 08.02.2020
Beiträge: 3

Themenstarter Thema begonnen von adhome

adhome ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie ist es mit einem Manager Klasse die Statisch ist ?
Also eine Art Oberste Instanz die man immer fragen kann wer der aktuelle Fahrer ist und der die Hauptverwaltung übernimmt.
AutoManager.GetCurrentDriver


Falsche Denkweise oder würde in das Modell passen?
Neuer Beitrag 08.02.2020 17:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.575
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von adhome:
Wie ist es mit einem Manager Klasse die Statisch ist ?

Statische Klassen haben gewisse Aufgaben; static ist aber nicht dazu da Design Fehler zu kaschieren.
Weiterhin sind statische Klassen nicht so einfach testbar bzw. machen Abhängigkeiten teilweise untestbar.
 [Artikel] Unit-Tests: Einführung in das Unit-Testing mit VisualStudio

Daher: völlig falsche Denkweise.
Für Abhängigkeiten, die direkt existieren, gibts Dependency Injection; passt hier aber nicht, denn der Hinweis von KroaX mit dem Bounded Context ist hier 100% korrekt und passend.

Du wirst Dich mit Software Design auseinander setzen müssen.
Sprach-Keywords in C# sind nicht dazu da OOP Probleme zu lösen.
Neuer Beitrag 08.02.2020 17:55 Beiträge des Benutzers | zu Buddylist hinzufügen
Alf Ator
myCSharp.de-Mitglied

avatar-586.gif


Dabei seit: 30.10.2007
Beiträge: 594
Entwicklungsumgebung: VS2005 / VS2008


Alf Ator ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo adhome

Ich möchte dein Beispiel mal aufgreifen.

Zitat von adhome:
Klasse Auto hat Instanzen der Klasse Autositz und Fahrer.
Nun will die Klasse Autositz rausfinden welcher Fahrer gerade im Auto ist.
Er müsste somit die Klasse Auto fragen. Nur wie greift Autositz auf Auto zu, wenn es nicht sowas wie eine Parent Eigenschaft gibt.

Es gibt bei modernen Autos die Möglichkeit, die Sitzeinstellung zu speichern und per Knopfdruck auszuwählen. Das heißt der große Fahrer mit den langen Beinen muss sich nicht ins Auto zwängen, weil seine Frau vorher gefahren ist, sondern er drückt auf einen Knopf und der Sitz fährt automatisch auf seine Position.

Wenn ich die Anforderung so lese, dann kommt mir die Idee, dass wir eine Klasse SitzEinstellung brauchen. Die Klasse Sitz muss den Fahrer nicht kennen, sondern hat eine Methode FahreInPosition(Sitzeinstellung). Aufgerufen wird diese Methode (je nach Anwendungsfall) vom Auto, denn da ist ja auch der Knopf dran.

Durch diese Denke ergeben sich fast automatisch übersichtlichere Klassen, mit spezifischer Verantwortung.


Nach DomainDrivenDesign könnte in diesem Beispiel das Auto das AggregateRoot sein. Es gibt ein bestimmtes Auto (Entity), in das ein bestimmter Fahrer einsteigt (nur eine Id notwendig). SitzEinstellung wäre dann ein ValueObject, Sitz eventuell auch. Die Kommunikation mit der Umwelt, oder dem Programm wird über das AggregateRoot Auto gemacht.

DomainDrivenDesign soll nicht überall angewendet werden, gehört meiner Meinung nach aber zur Bettlektüre vom professionellen Entwickler, da es das Denken ungemein erweitert.


Gruß
Alf
Neuer Beitrag 09.02.2020 11:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 01.04.2020 10:18