[ruby-de] Namensräume

Jörg W Mittag ruby-de at joergwmittag.de
Di Jun 13 08:30:11 JST 2017


Hallo,

> class A
>   module M
>        def m
>          p 99
>       end
>   end
> end
>
> A::M.new.m
> warum geht das nicht?

Weil Module keine `new` Methode haben, was sich ganz einfach auch
in der Dokumentation (http://ruby-doc.org/core/Module.html)
nachlesen lässt oder man auch einfach von Ruby selbst erfragen
kann:

```ruby
Module.public_methods.include?(:new) #=> false
```

> Sind Module immer nur im Main-Space üblich?

Ich habe keine Ahnung, was das heißen soll.


Übrigens, mir ist aufgefallen, dass deine Fragen unglaublich
schwer zu beantworten sind. Das hat jedoch nichts damit zu tun,
dass die Fragen selbst so hart wären, ganz im Gegenteil: die
überwiegende Mehrzahl ist absolut trivial und lässt sich durch
kurzes Überfliegen der Dokumentation, Lesen der Fehlermeldung,
oder eine kurze Google-Suche innerhalb von Sekunden lösen. Das
Problem ist, dass die Fragen dermaßen unklar gestellt sind, dass
es typischerweise ein mehrtägiges hin und her an Gegenfragen und
(oftmals ebenso unklaren) Ergänzungen erfordert, um überhaupt den
Hauch einer Chance zu haben, zu verstehen, *was* die Frage ist.

Darum hier ein paar Tipps zum Stellen besserer Fragen:

* Aussagekräfige Betreffzeile: die Betreffzeile sollte kurz und
    knapp das Thema der Frage beschreiben. Die Betreffzeile ist
    das erste (und typischerweise auch das einzige), das ein
    potenzieller Helfer zu Gesicht bekommt, um zu entscheiden, ob
    ihn das Thema interessiert und ob er die nötige Expertise hat.
    Ein guter Trick zum Schreiben einer guten Betreffzeile ist,
    die Betreffzeile als *letztes* zu schreiben, nachdem du deine
    Frage vollständig ausformuliert hast.

    Deine Betreffzeilen sind fast ausschließlich unglaublich
    generisch und sagen absolut nichts über den Inhalt aus.
    Oftmals sind sie zudem auch noch irreführend und haben –
    nachdem man denn irgendwann mal die Frage verstanden hat –
    nur am Rande (wenn überhaupt) mit der Frage zu tun.

    Stelle dir vor, ein vollkommen Fremder hält dich auf der
    Straße an und sagt nichts weiter als „expression übergeben“
    oder „Namensräume“. Und mit dieser Ansprache möchte er dich
    dazu bewegen, deine Arbeit ruhen zu lassen und *kostenlos*
    deine Freizeit (oder deine Arbeitszeit(!!!)) exklusiv für ihn
    zu opfern, um eine Arbeit zu machen, die eigentlich *seine*
    Aufgabe wäre. Würde dich diese Ansprache überzeugen? Enthält
    sie genug Informationen, um zu entscheiden, ob es sich lohnt,
    deine Zeit kostenlos zur Verfügung zu stellen? Zeugt diese
    Ansprache davon, dass der unbekannte Fremde selber hinreichend
    an der Lösung des Problems interessiert ist, dass er bereit
    ist, signifikante Zeit und Ressourcen zu opfern, um mit dir an
    der Lösung des Problems zusammen zu arbeiten?

* Eine klar, präzise, unmissverständlich und nachvollziehbar
    formulierte Problemstellung, mit eindeutigen und objektiven
    Kriterien für eine Lösung des Problems. Wir wissen absolut
    nichts über dein Problem, dein System, deinen Quelltext, deine
    Architektur, deinen Entwurf, kurz den gesamten Kontext. All
    das muss aus der Problembeschreibung hervorgehen! Und zwar in
    einer Art und Weise, dass es unmissverständlich klar ist.

    Das ist nicht nur wichtig, weil ohne alle diese Informationen
    und den Kontext eine Beantwortung der Frage schlicht nicht
    möglich ist. Es ist auch und vor allem deswegen wichtig, weil
    Computer unglaublich dumm sind. Viel, viel, viel dümmer als
    Menschen! Sie verstehen keinen Kontext, sie haben keine
    Kreativität, sie können keine Nachfragen stellen. Wenn du
    nicht in der Lage bist, dich klar, präzise und nachvollziehbar
    in einer Art und Weise auszudrücken, dass Menschen dich
    unmissverständlich verstehen, dann ist es erst recht 100%
    absolut undenkbar, dass ein Computer dich verstehen wird,
    sprich dass du jemals in der Lage sein wirst, ein Programm zu
    schreiben.

    Wichtig ist auch, dass es objektive und klare Kriterien gibt,
    an denen die Leute, die hart kostenlos für dich an deinen
    Problemen arbeiten, erkennen können, ob sie Fortschritte
    machen, wie weit sie noch von einer Lösung entfernt sind, wann
    sie damit aufhören können, und ob sie dein Problem korrekt
    gelöst haben. Deine Problembeschreibung sollte alle nötigen
    Informationen enthalten, die nötig sind, um zu sagen: „Ja,
    das ist exakt, was er möchte, das Problem ist gelöst.“

* Achte darauf, dass deine Frage auch tatsächlich eine Frage ist.
    Deine Fragen sind oftmals gar keine Fragen sondern einfach nur
    eine Beschreibung dessen, was passiert. (Oder noch schlimmer:
    einfach nur ein Quelltext-Schnipsel ohne irgendwelche
    Informationen.) Aber, was hast du erwartet? Was meinst du,
    das statt dessen hätte passieren sollen? Und warum? Worin
    unterscheidet sich das, was du beobachtest von dem was du
    erwartest? Gab es eine Fehlermeldung? Wie lautet sie? Wurde
    eine Ausnahme aufgeworfen? Welche? Wie lautet die Nachricht?

* Wichtig ist auch, darzulegen, welche Anstrengungen du bisher
    unternommen hast, das Problem zu lösen, wie und warum diese
    nicht funktioniert haben, und warum du keinerlei andere
    Lösungswege mehr siehst. Nicht nur zeigt das einem
    potenziellen Antworter, dass du nicht darauf aus bist, einfach
    nur aus Faulheit kostenlos jemand anderen deine Arbeit machen
    zu lassen, sondern tatsächlich selber mindestens so hart an
    der Lösung arbeitest wie wir. Noch viel wichtiger ist, dass
    wir nicht sinnlos unsere Zeit damit verschwenden, Lösungswege
    zu verfolgen, welche du bereits ausführlich und gründlich
    untersucht und für unwirksam befunden hast.

Hier sind ein paar Verweise auf Artikel, die gute Hinweise geben,
wie man gute Fragen formuliert:

How do I ask a good question?
https://stackoverflow.com/help/how-to-ask

Writing the perfect question
https://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/

How To Ask Questions The Smart Way
http://catb.org/~esr/faqs/smart-questions.html

How to create a Minimal, Complete, and Verifiable example
https://stackoverflow.com/help/mcve

The SSCCE – Short, Self Contained, Correct (Compilable), Example
http://sscce.org/

How to debug small programs
https://ericlippert.com/2014/03/05/how-to-debug-small-programs/

Beste Grüße,
    Jörg.


Mehr Informationen über die Mailingliste ruby-de