Hintergrund:
Ich habe ein Modul, das eine Reihe von Instanzmethoden deklariert
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
Und ich möchte einige dieser Methoden innerhalb einer Klasse aufrufen. Wie Sie dies normalerweise in Rubin tun, ist wie folgt:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Problem
include UsefulThings
bringt alle Methoden aus UsefulThings
. In diesem Fall will ich nur format_text
und will explizit nicht get_file
und delete_file
.
Ich kann mehrere mögliche Lösungen dafür sehen:
- Rufen Sie die Methode irgendwie direkt auf dem Modul auf, ohne sie irgendwo einzuschließen
- Ich weiß nicht, wie / ob das geht. (Daher diese Frage)
- Irgendwie einschließen
Usefulthings
und nur einige seiner Methoden einbringen- Ich weiß auch nicht, wie / ob das geht
- Erstellen Sie eine Proxy-Klasse, schließen Sie
UsefulThings
diese ein und delegieren Sie sieformat_text
an diese Proxy-Instanz- Dies würde funktionieren, aber anonyme Proxy-Klassen sind ein Hack. Yuck.
- Teilen Sie das Modul in 2 oder mehr kleinere Module auf
- Dies würde auch funktionieren und ist wahrscheinlich die beste Lösung, die ich mir vorstellen kann, aber ich würde es vorziehen, sie zu vermeiden, da sich am Ende Dutzende und Dutzende von Modulen ansammeln würden - dies zu verwalten wäre mühsam
Warum gibt es in einem Modul viele unabhängige Funktionen? Es stammt ApplicationHelper
aus einer Rails-App, die unser Team de facto als Müllhalde für alles ausgewählt hat, was nicht spezifisch genug ist, um irgendwohin zu gehören. Meist eigenständige Dienstprogrammmethoden, die überall verwendet werden. Ich könnte es in separate Helfer aufteilen, aber es würden 30 von ihnen sein, alle mit jeweils einer Methode ... das scheint unproduktiv
module UT; def add1; self+1; end; def add2; self+2; end; end
und möchten verwenden, add1
aber nicht add2
im Unterricht Fixnum
. Wie würde es helfen, Modulfunktionen dafür zu haben? Vermisse ich etwas
Module#included
Rückruf verwenden , um eineninclude
der anderen auszulösen . Dieformat_text
Methode könnte in ein eigenes Modul verschoben werden, da sie für sich genommen nützlich zu sein scheint. Dies würde das Management etwas weniger belasten.