Warum erweitern Menschen das Objekt, erweitern sie ihre Begleitklasse?

8

Ich finde, dass diese Art von Code im Lift-Framework sehr gebräuchlich ist, geschrieben wie folgt:
object BindHelpers extends BindHelpers {} Was bedeutet das?

    
Sawyer 14.02.2011, 11:31
quelle

4 Antworten

6

In diesem Fall ist BindHelpers ein Merkmal und keine Klasse. Lassen Sie foo() zu einer in BindHelpers definierten Methode werden, um darauf zuzugreifen, können Sie entweder.

  1. Verwenden Sie es über das Begleitobjekt: BindHelpers.foo()

  2. Mische das Merkmal BindHelpers in einer Klasse und bin so in der Lage, auf die darin enthaltenen Methoden zuzugreifen.

Zum Beispiel:

%Vor%

Die gleichen Techniken werden in Scalatest zum Beispiel für ShouldMatchers verwendet.

    
paradigmatic 14.02.2011 14:50
quelle
3
___ qstnhdr ___ Warum erweitern Menschen das Objekt, erweitern sie ihre Begleitklasse? ___ qstntxt ___

Ich finde, dass diese Art von Code im Lift-Framework sehr gebräuchlich ist, geschrieben wie folgt:
%code% Was bedeutet das?

    
___ answer4991802 ___

Es ist interessant für ein %code% , seine Begleitklasse zu erweitern, da es den gleichen Typ wie die Klasse hat.

Wenn %code% BindHelpers nicht erweitert hat, wäre es vom Typ %code% .

    
___ antwort5002906 ___

Sie finden David Pollaks Antwort zu derselben Frage in der Liftwebgruppe.

    
___ answer4993550 ___

In diesem Fall ist %code% ein Merkmal und keine Klasse. Lassen Sie %code% zu einer in %code% definierten Methode werden, um darauf zuzugreifen, können Sie entweder.

  1. Verwenden Sie es über das Begleitobjekt: %code%

  2. Mische das Merkmal %code% in einer Klasse und bin so in der Lage, auf die darin enthaltenen Methoden zuzugreifen.

Zum Beispiel:

%Vor%

Die gleichen Techniken werden in Scalatest zum Beispiel für %code% verwendet.

    
___ tag123scala ___ Scala ist eine universelle Programmiersprache, die hauptsächlich auf die Java Virtual Machine abzielt. Entwickelt, um gängige Programmiermuster in einer prägnanten, eleganten und typsicheren Weise auszudrücken, vereint es sowohl imperative als auch funktionale Programmierstile. Seine Hauptmerkmale sind: fortgeschrittenes statisches System mit Typinferenz; Funktionstypen; Muster-Matching; implizite Parameter und Konvertierungen; Überlastung des Bedieners; volle Interoperabilität mit Java; Nebenläufigkeit ___ answer4992888 ___

Es könnte sein, dass das Muster hier anders ist. Ich weiß Lift nicht, um das zu beantworten, aber es gibt ein Problem mit %code% darin, dass sie nicht mockbar sind. Wenn Sie also alles in einem %code% definieren, das verspottet werden kann, und das Objekt dann einfach erweitern, können Sie die Klasse vortäuschen und sie anstelle des Objekts in Ihren Tests verwenden.

    
___
Marcello Nuccio 15.02.2011 11:13
quelle
2

Es könnte sein, dass das Muster hier anders ist. Ich weiß Lift nicht, um das zu beantworten, aber es gibt ein Problem mit object darin, dass sie nicht mockbar sind. Wenn Sie also alles in einem class definieren, das verspottet werden kann, und das Objekt dann einfach erweitern, können Sie die Klasse vortäuschen und sie anstelle des Objekts in Ihren Tests verwenden.

    
Daniel C. Sobral 14.02.2011 13:47
quelle
2

Es ist interessant für ein object , seine Begleitklasse zu erweitern, da es den gleichen Typ wie die Klasse hat.

Wenn object BindHelpers BindHelpers nicht erweitert hat, wäre es vom Typ BindHelpers$ .

    
Felipe Kamakura 14.02.2011 11:50
quelle

Tags und Links