Eclipse - Klassen "entbupblicen" ?

Hey Leute.
Ich hab ne kleine Lib zusammengebastelt, und gerade beschlossen das der Nutzer
nicht mit den vorhandenen Klassen direkt Hantieren soll, sondern mit einer statischen Factory Klasse
arbeiten soll. Dazu kann ich ja einfach die “public” keywords von allen Klassen (aussder der Factory ^^)
entfernen, dann sind die ausserhalb der lib ja auch nicht mehr sichtbar.
(Btw: ist das überhaupt eine gute idee?..)
Hat Eclipse da entsprechende Funktionen (ala Klassen auswählen - rechtsklick - …), oder muss ich mich jetzt durch jede Klasse kämpfen und von hand public entfernen? ^^
Ist im Moment ja nicht soo viel arbeit, aber bei großen projekten ja ganz schön nervig?..

Hab da nichts zu gefunden irgendwie…
Danke!

ist z.B. so ein Standard, der für solche Geschichten gedacht ist.

Interface und öffentliche Klassen kommen dort in ein package und sind dann von außerhalb sichtbar.
Die Konkreten Implementierungen landen in einem anderen package.

Im Manifest wird dann festgelegt ob das package von außerhalb sichtbar ist oder nicht.

Dafür braucht man allerdings die entsprechende OSGI-Runtime auf der das ganze läuft.

Eine andere Möglichkeit ist das ganze in zwei Projekte zu trennen.

In eines kommt die ganze Api, die öffentlich zugänglich sein soll in ein anderes alles was nicht öffentlich sein soll.

Der Benutzer bekommt dann zum Programmieren nur das Api-jar und zum Laufen lassen noch das jar mit dem Rest.

Bei JEE wird das z.B. so gehandhabt. Man hat dort ein jars mit dem JEE Standard und die Implementierung die dahinter steckt, ist dann auf dem Applicationserver.

[QUOTE=mymaksimus]Hey Leute.
Ich hab ne kleine Lib zusammengebastelt, und gerade beschlossen das der Nutzer
nicht mit den vorhandenen Klassen direkt Hantieren soll, sondern mit einer statischen Factory Klasse
arbeiten soll. Dazu kann ich ja einfach die „public“ keywords von allen Klassen (aussder der Factory ^^)
entfernen, dann sind die ausserhalb der lib ja auch nicht mehr sichtbar.
(Btw: ist das überhaupt eine gute idee?..)[/quote]
wenn du lib schon veroeffentlich ist und du an der public API schraubst kann es gut sein, dass du damit anderer Code brichst. Sowas sollte immer mit vorsicht getan werden. Sinnvoll waere die besser moeglichkeit anzubieten und die Aenderungen erstmals als deprecated zu markieren und dann nach gewisser zeit zu entfernen.
Oder du sagst klar dass mit der neuen Version du die API brichst und alle muessen sich damit abfinden

Ansonsten ist die Idee gut, haette nur am Anfang schon sein sollen :wink:

[QUOTE=mymaksimus;87854]Hat Eclipse da entsprechende Funktionen (ala Klassen auswählen - rechtsklick - …), oder muss ich mich jetzt durch jede Klasse kämpfen und von hand public entfernen? ^^
Ist im Moment ja nicht soo viel arbeit, aber bei großen projekten ja ganz schön nervig?..[/quote]
du kannst natuerlich ein globales find/replace laufen lassen, wobei die Gefahr dann groesser ist, dass du zuviel weghaust und dann die gleiche Zeit verschwendest die false positives wieder zu korrigieren

Hab da nichts zu gefunden irgendwie…
Danke![/QUOTE]

Um das ^ nochmal zu bekräftigen/betonen: Bei der ersten Veröffentlichung sollte das Mantra gelten „When in Doubt, Leave it Out!“.

Es gibt nicht sooo viele Videos, die mich veranlassen würden, jemandem nachdrücklich zu empfehlen, eine Stunde für das Ansehen dieses Videos zu investieren. Aber …

ANSEHEN: http://www.infoq.com/presentations/effective-api-design :smiley:

Wenn du sicher sein kannst, dass die Lib noch keine wirkliche Verbreitung hast, dann mach alles nicht-public, was nicht public sein muss - je früher desto besser (-> man sollte sich angewöhnen, erstmal alles nicht-public zu machen)

Ein konkretes Tool für dieses Vorhaben wüßte ich nicht. Um wie viele Klassen geht es denn? Der Workflow ist ziemlich einfach, und sollte selbst bei einigen 100 Klassen noch in wenigen Minuten erledigt sein:


1. Alle Codefenster zumachen
2. Im Baum links auf alle [+] vor den Packagenamen klicken (von unten nach oben! Du wirst sehen, warum ;-))
3. while (!untenAngekommen)
    {
        3a. Doppelklick auf oberste (unbearbeitete) Klasse
        3b. Doppelklick auf das Wort "public"
        3c. 2 x auf "ENTF" drücken
    }
4. Überlegen, wie die Compilerfehler gefixt werden.

Beim letzen Punkt steht „überlegen“. Also nicht einfach wieder „public“ hinschreiben, ~„damit es compiliert“, sondern wirklich überlegen, ob die jeweilige Klasse „public“ sein sollte!

Ach ja, zu Marco’s Workflow sei noch angemerkt, dass ein commit, sogar mit Tag hier sehr angebracht ist, bevor man loslegt.

Marco das ist mir klar :smiley:
Und es benutzen nur ein paar Freunde, daher ist es nur eine Frage der „Geht das denn generell“ art :smiley:
Es ist nicht viel aufwand sich durchzuklicken, aber wenn ich irgendwann 100 klassen hab ist es nicht mehr so toll :wink:
Da ich keine inner classes hab ist ein global find replace natürlich toll, werde mal kurz googeln.

da ich neugierig bin :smiley: was kann die lib denn so? Vielleicht ist es ja was neues und innovatives das ich brauchen könnte und schon immer haben wollte :wink:

Ich denke wohl kaum, dabei handelt es sich nur um die basic implementierungen von lwjgl kram :wink:
War eigentlich eher für mich zum „nicht immer wieder neu schreiben“, aber ein paar freunde sind halt zu faul es selber zu lernen xD
Im Moment hab ich ja noch nicht mal Texturen implementiert…

[QUOTE=mymaksimus]Ich denke wohl kaum, dabei handelt es sich nur um die basic implementierungen von lwjgl kram :wink:
War eigentlich eher für mich zum „nicht immer wieder neu schreiben“, aber ein paar freunde sind halt zu faul es selber zu lernen xD
Im Moment hab ich ja noch nicht mal Texturen implementiert…[/QUOTE]

Zu viele Fachbegriffe in einem Satz o.O ich verstehe zwar kaum was von lwjgl, OpenGL, OpenAL und Texturen (ich hasse Games, von daher fehlt da die Motivation xD), aber es hört sich recht praktisch an…

wie kann man eins der größten errungenschaften der programmierung hassen? xD
Naja, wenn du dich doch mal damit beschäftigst schreib mich an :smiley:
texturen sind einfach nur quasi bilder die auf objekte gelegt werden ^^

[QUOTE=mymaksimus]wie kann man eins der größten errungenschaften der programmierung hassen? xD
Naja, wenn du dich doch mal damit beschäftigst schreib mich an :smiley:
texturen sind einfach nur quasi bilder die auf objekte gelegt werden ^^[/QUOTE]

Sagen wir es mal so: Games an sich sind nicht scheiße (die meisten nicht). Aber wahrscheinlich liegt mein Hass in der programmierung darin, dass es mir:

  1. An einer Idee für ein Game fehlt, denn Klonen kann jeder :wink: Ja, selbst ich krieg es hin
  2. Ich auch keine Zeit/Lust habe, mich in ne neue API einzulesen :smiley:
  3. Android Apps viel cooler sind;)

da muss ich was einwenden:

  1. Erstmal grundlagen, von einem eigenen game sei es auch ein kloon ist man am anfang weeeeiiit entfernt
  2. Das… ist eigentlich täglich Brot :smiley: Und Lwjgl ist nicht gerade kompliziert wenn man erstmal drin ist :wink:
  3. Das sind basics für android games ^^

Das bezweifle ich. Ich hab schon ein paar Klone gemacht (wzar ohne Framework, einfaches Java2D), so schwer ist das nicht. Und die Basics und Funktionalität (also z.B. Game-Loop) haste ja auch in Desktop Programmierung in beispielsweise Swing. Dort passiert ziemlich genau das gleiche.

Wer redet hier von Android-Games xD ich schreib meistens Apps die ich brauche oder nicht gut umgesetzt finde. Wie gesagt, ich hasse Games :wink:
Die Bibliothek an sich ist nicht schwer, nur das OpenGL erfordert eine Menge Zeit bis es gut (!) und effizient (!) genutzt werden kann.

[QUOTE=groggy]Das bezweifle ich. Ich hab schon ein paar Klone gemacht (wzar ohne Framework, einfaches Java2D), so schwer ist das nicht. Und die Basics und Funktionalität (also z.B. Game-Loop) haste ja auch in Desktop Programmierung in beispielsweise Swing. Dort passiert ziemlich genau das gleiche.

Wer redet hier von Android-Games xD ich schreib meistens Apps die ich brauche oder nicht gut umgesetzt finde. Wie gesagt, ich hasse Games :wink:
Die Bibliothek an sich ist nicht schwer, nur das OpenGL erfordert eine Menge Zeit bis es gut (!) und effizient (!) genutzt werden kann.[/QUOTE]

  1. Ich dachte da an komplexere 3d dinge und keine java2d klone ^^

  2. Achso, sowas meinst du ^^ Naja das stimmt natürlich, mit gui baukasten und ein bisschen basic verständniss hat man sowas schnell zusammengebastelt.

  3. Eigentlich nicht. Letzendlich ist effizienz da, sobald man die basics implementiert hat, viel kann man da nicht improven. Natürlich, wenns hochkomplex wird, aber
    auch da bruacht man nur die mathematik und die logik.

[quote=mymaksimus]3) Eigentlich nicht. Letzendlich ist effizienz da, sobald man die basics implementiert hat, viel kann man da nicht improven. Natürlich, wenns hochkomplex wird, aber
auch da bruacht man nur die mathematik und die logik.[/quote]

Blabla bla :smiley: mir fallen keine Argumente mehr ein. Ich weiß jetzt auch net viel über OpenGL aber ich denke mal (und behaupte es auch), dass Effizienz immer verbessert werden kann. Ob es beim Rendern oder beim Kalkulieren ist. Zum Beispiel könnte ein Anfänger da was mit dutzenden Vector3 bzw. Vector4 Objekten anstellen obwohl er eigentlich nur mal ‚schnell‘ zwei Matrixen miteinander multiplizieren musste. Das kannn an der Renderingzeit ordentlich was tun.
Und wenn es ja einfach wäre, würde es sowas nicht geben:
Common Mistakes oder Avoiding 16 OpenGL Pitfalls

Also würde ich behaupten, dass man als Anfänger schon Fehler machen kann und auch machen wird! :smiley:

ja klar, das ist auch immer so :smiley:
Aber es ist eben nicht so wie zum beispiel bei… naja zum beispiel bei assembler (xD)
dass du da ein paar jahre für wirkliche erfolge brauchst :wink:

[quote=mymaksimus]Aber es ist eben nicht so wie zum beispiel bei… naja zum beispiel bei assembler (xD)
dass du da ein paar jahre für wirkliche erfolge brauchst[/quote]

Meistens denkt man bei Assembler “ich versteh doch so oder so gar nichts”, aber so schwer ist das nicht. Das hat man schnell (!) raus. Es dauert vielleicht nen Tag wenn man sich wirklich durchgehend hinsetzt. Sowas wie Brainfuck find ich schwerer xD

oder whitespace… aber du weisst was ich meine :smiley:

jaja :wink: