2012-03-30 13 views
5

Szukałem jakiegoś kodu dewelopera i prawie płakałem. W definicji metody znajduje się 12 argumentów. Z mojego doświadczenia ... to nie jest dobre. Gdyby to był ja, wysłałbym jakiś przedmiot.Jakie są lepsze sposoby tworzenia metody, która wymaga wielu argumentów? (10+?)

Czy jest inny/bardziej preferowany sposób to zrobić (innymi słowy, jaki jest najlepszy sposób, aby to naprawić i wyjaśnić dlaczego)?

public long Save (
    String today, 
    String name, 
    String desc, 
    int ID, 
    String otherNm, 
    DateTime dt, 
    int status, 
    String periodID, 
    String otherDt, 
    String submittedDt 
) 

ignorować moje biedne nazwy zmiennych - są przykładami

+1

Czy argumenty są w jakiś sposób powiązane? Jeśli tak, zgrupuj je w obiekcie opisującym semantyczną. Mam nadzieję, że to pomoże. –

+0

Myślałem, że to rozsądne pytanie, dlaczego są dwa głosy, aby je zamknąć? – Cody

Odpowiedz

5

To bardzo zależy od języka.

W języku bez kompilacji typechecking (np Python, JavaScript, etc.) należy użyć argumentów słów kluczowych (wspólne w Pythonie: można z nich korzystać jak ze słownika przekazany jako argument) lub obiektów/słowniki ręcznie przekazujesz jako argumenty (często w javascript).

Jednak opisywany przez ciebie "argument piekielny" jest czasami "właściwym sposobem robienia rzeczy" dla niektórych języków z kompilacją typu, ponieważ użycie obiektów zaciemni semantykę od typechecker. Rozwiązaniem byłoby wówczas użycie lepszego języka z lepszą wersją językową z metodą sprawdzania pisowni na podstawie kompilacji, która umożliwia porównywanie wzorców obiektów jako argumentów.

2

Tak, użyj obiektów. Ponadto funkcja prawdopodobnie robi zbyt wiele, jeśli potrzebuje wszystkich tych informacji, więc używaj mniejszych funkcji.

+1

Tak myślałem. W rzeczywistości tylko wstawianie danych do tabeli ... – Cody

1

To zależy od złożoności funkcji. Jeśli zrobi coś nie banalnego z każdym z tych argumentów, prawdopodobnie powinno zostać podzielone. Jeśli tylko je przejdzie, prawdopodobnie powinny zostać zebrane w obiekcie. Ale jeśli po prostu tworzy wiersz w tabeli, nie jest to naprawdę wielka sprawa. To mniej, jeśli twój język obsługuje argumenty słów kluczowych.

1

Użyj obiektów.

class User { ... } 
User user = ... 
Save(user); 

Decyzja ta zapewnia łatwy sposób dodawania nowych parametrów.

0

Wyobrażam sobie, że problem, którego doświadczasz, jest w stanie spojrzeć na wywołanie metody i wiedzieć, jaki argument otrzymuje jaką wartość. Jest to szkodliwy problem w języku takim jak Java, w którym brakuje argumentów słów kluczowych lub skrótów JSON do przekazywania nazwanych argumentów.

W tej sytuacji przydatne jest rozwiązanie Builder pattern. To więcej obiektów, trzy ogółem, ale prowadzi do bardziej zrozumiałego kodu problemu, który opisujesz. Więc te trzy obiekty w tym przypadku byłoby jako takie:

  1. Thing: Stateful podmiot, zazwyczaj niezmienne (czyli tylko getters)
  2. ThingBuilder: klasa fabryka tworzy podmiot rzecz i ustawia jego wartości .
  3. ThingDAO: nie jest konieczne do korzystania z wzorca Buildera, ale zawiera odpowiedź na pytanie.

Interakcje

/* 
ThingBuilder is a static inner class of Thing, where each of its 
"set" method calls returns the ThingBuilder instance being worked with 
while the final "build()" call returns the instantiated Thing instance. 
*/ 
Thing thing = Thing.createBuilder(). 
       .setToday("2012/04/01") 
       .setName("Example") 
       // ...etc... 
       .build(); 

// the Thing instance as get methods for each property 
thing.getName(); 

// get your reference to thingDAO however it's done 
thingDAO.save(thing); 

Rezultatem jest dostać nazwanych argumentów i niezmienny instancji.