2017-05-07 3 views
1

Ich habe eine Schnittstelle ForumApi in der Klasse ForumService. Ich benutze Retrofit und Rxjava hier. Normalerweise für Retrofit, implementieren wir eine Schnittstelle, aber in der unten genannten Code sehe ich die Schnittstelle innerhalb der Klasse. Gibt es einen bestimmten Grund dafür?Warum brauchen wir eine Schnittstelle, die in der Klasse deklariert wird? Haben wir dadurch einen Vorteil?

public class ForumService { 

    public interface ForumApi { 

     @GET("/posts") 
     public Observable<List<Post>> 
      getPosts(); 

     @GET("/posts/{id}") 
     public Observable<Post> 
      getPost(@Path("id") int postId); 

     @GET("/comments") 
     public Observable<List<Comment>> 
      getComments(@Query("postId") int postId); 

     @POST("/posts") 
     public Observable<Post> 
      postPost(Post post); 
    } 
} 

Antwort

3

Wenn eine Schnittstelle A soll durch eine bestimmte Klasse/Schnittstelle verwendet werden B dann es Sinn, sie zusammen A innen B indem er erklärt, zu binden macht.

Ein weiteres Beispiel ist die Schnittstelle Map.Entry, die innerhalb der Map Schnittstelle deklariert wird (zum Beispiel sind Sie eigentlich nicht Map.Entry in einem List verwenden).

+0

Ich muss hier nicht zustimmen. Wenn die Schnittstelle "A" für die spezifische Klasse "B" vorgesehen ist, aber "A" für die Vernetzung und "B" für die Geschäftslogik, sollten sie definitiv nicht in derselben Datei deklariert werden. Ich würde sogar nicht im selben Paket sagen. – Vasiliy

+0

@Vasiliy danke, dass du einen Schritt weiter gegangen bist, aber mir fällt kein Anwendungsfall ein, wie du ihn beschrieben hast. Ein Beispiel wäre erwünscht! – alfasin

+0

Ich bin nicht sicher, was meinst du mit "Use-Case". IMHO Jede Klasse, die Geschäftsregeln und netzwerkbezogene Regeln kombiniert, verletzt das Prinzip der einfachen Verantwortlichkeit und sollte refaktorisiert werden. Vorzugsweise in verschiedene Pakete. – Vasiliy

0

IMHO ist dies eine nicht optimale Designentscheidung.

Es gibt einige gültige Anwendungsfälle für innere Schnittstellen. Beispiel: Bei der Implementierung des Observable-Entwurfsmusters ist es eine weit verbreitete Praxis, die Observer-Schnittstelle (Listener) als innere Schnittstelle in Observable zu deklarieren, wenn eine Eins-zu-Eins-Übereinstimmung zwischen Observer und Observable besteht.

Dies ist in Ihrem Code nicht der Fall.

Ich weiß nicht, was ForumService tut, aber ich denke, dass es einige Geschäftslogik im Zusammenhang mit Forum-Management enthält. Wenn dies der Fall ist, sollten ForumService und ForumApi gemäß dem Prinzip der einheitlichen Verantwortung nicht in derselben Klasse deklariert werden.

Ich gehe auch so weit zu sagen, dass sie nicht in dem gleichen Paket definiert werden sollten. Alle netzwerkbezogenen Klassen sollten sich in einem separaten Paket befinden, das nur Netzwerkressourcen enthält.

Darüber hinaus enthält die Schnittstelle in diesem Fall Implementierungsdetails - Retrofit-Annotationen. Durch die Platzierung dieser Schnittstelle innerhalb ForumService macht das Design effektiv ForumService von Retrofit abhängig. Dies ist weniger wichtig, aber immer noch ein Grund, diese Schnittstelle aus der Klasse umzuformen.

Verwandte Themen