複数の関数を介して複数のパラメーターを渡す方法

magu_

公開された関数(レベル0)があると仮定しましょう。この関数をさまざまなパラメーターで呼び出します。内部的には、この関数は2番目の関数(レベル1)を呼び出しますが、引数として3番目の関数(レベル2)を呼び出す以外は、指定されたパラメーターを使用しません。しかし、それは他のことをするかもしれません。

私の質問はです。中間層関数(レベル1)であまりノイズを発生させずに、引数を渡すにはどうすればよいですか?以下にいくつかの可能な方法をリストします。ただし、それらのいくつかはかなり醜く、完全性の理由でのみ存在することに注意してください。トピックに関する個人的な意見ではなく、確立されたガイドラインを探しています

# Transport all of them individually down the road.
# This is the most obvious way. However the amount of parameter increases the
# noise in A_1 since they are only passed along
def A_0(msg, term_print):
    A_1(msg, term_print)

def A_1(msg, term_print):
    A_2(msg, term_print)

def A_2(msg, term_print):
    print(msg, end=term_print)


# Create parameter object (in this case dict) and pass it down.
# Reduces the amount of parameters. However when only reading the source of B1
# it is impossible to determine what par is
def B_0(msg, term_print):
    B_1({'msg': msg, 'end': term_print})

def B_1(par):
    B_2(par)

def B_2(par):
    print(par['msg'], end=par['end'])


# Use global variables. We all know the pitfalls of global variables. However
# in python there are at least limited to their module
def C_0(msg, term_print):
    global MSG, TERM_PRINT

    MSG = msg
    TERM_PRINT = term_print
    C_1()

def C_1():
    C_2()

def C_2():
    print(MSG, end=TERM_PRINT)


# Use the fact that python creates function objects. We can now append those
# objects. This makes some more 'localised' variables than shown before. However
# this also makes the code harder to maintain. When we change D_2 we have to alter
# D_0 as well even though it never directly calls it
def D_0(msg, term_print):
    D_2.msg = msg
    D_2.term_print = term_print
    D_1()

def D_1():
    D_2()

def D_2():
    print(D_2.msg, end=D_2.term_print)


# Create a class with the functions E_1, E_2 to enclose the variables.
class E(dict):
    def E_1(self):
        self.E_2()

    def E_2(self):
        print(self['msg'], end=self['end'])

def E_0(msg, term_print):
    E([('msg', msg), ('end', term_print)]).E_1()


# Create a nested scope. This make it very hard to read the function. Furthermore
# F_1 cannot be called directly from outside (without abusing the construct)
def F_0(msg, term_print):
    def F_1():
        F_2()

    def F_2():
        print(msg, end=term_print)

    F_1()


A_0('What', ' ')
B_0('is', ' ')
C_0('the', ' ')
D_0('best', ' ')
E_0('way', '')
F_0('?', '\n')
ブレンダン・アベル

非常に多くのパラメーターと非常に多くのレベルの関数が存在する理由の完全な詳細を知らずに、完全な答えを出すことは困難です。ただし、一般に、渡すパラメータが多すぎると見なされますcode smell

一般に、関数のグループがすべて同じパラメーターを使用する場合、それらは何らかの方法で密接に関連しており、関連するすべてのメソッドがそのデータを共有できるように、クラス内にパラメーターをカプセル化することでメリットが得られる可能性があります。

TooManyParametersは多くの場合CodeSmellです。その量のデータを一緒に渡す必要がある場合は、データが何らかの方法で関連していて、独自のクラスにカプセル化する必要があることを示している可能性があります。別々に属する単一のデータ構造を渡すことは問題を解決しません。むしろ、アイデアは、一緒に属するものは一緒に保つということです。離れて属するもの、離れておく; OneResponsibilityRuleごと。

実際、他の関数にデータを渡すだけであれば、関数全体が完全に不要であることに気付くかもしれません。

class A(object):

    def __init__(self, msg, term_print)
        super(A, self).__init__()
        self.msg = msg
        self.term_print = term_print

    def a_0():
        return self.a_1()

    def a_1():
        return self.a_2()

    def a_2():
        print msg, term_print

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

WPFDataTriggerを介してMultivalueConverterで複数のパラメーターを渡す方法

分類Dev

関数を介してSQLに複数のパラメーターを渡すVBA

分類Dev

xargsを介して複数のパラメーターを渡す

分類Dev

AJAXを介して複数のパラメーターをPHPに渡す

分類Dev

FirebaseDynamicリンクAndroidを介して複数のパラメータを渡す

分類Dev

Kotlinの関数を介して演算子パラメーターを渡す方法

分類Dev

SQL関数に複数のパラメーターを渡す

分類Dev

ラムダ関数で複数のパラメーターを渡して取得する方法は?

分類Dev

複数のリスト値を関数パラメーターとして渡す方法は?

分類Dev

web-apiを使用して複数のパラメーターを渡す方法

分類Dev

複数の列をパラメーターとしてpysparkに渡す方法writerepartition()

分類Dev

同じパラメータを複数の関数に渡す方法は?

分類Dev

関数をJavaのパラメーターとして渡して、複数回実行する方法

分類Dev

関数内のForループにパラメーターとして複数の配列を渡す

分類Dev

Python:Pythonの方法で関数から関数に複数のパラメーターを渡す

分類Dev

Javascript-CreateStore-複数の関数を1つのパラメーターとして渡す-Redux-ReactNative

分類Dev

複数のクロージャをパラメータとしてswiftの関数に渡す

分類Dev

関数へのパラメーターとして複数の配列を渡す

分類Dev

$ .ajaxを使用して複数のパラメーターをPOSTでphp関数に渡す

分類Dev

<s:url /> Struts2タグを介して複数のパラメーターを渡す

分類Dev

PowerShellを介して複数のクエリパラメーターをWebServiceに渡します

分類Dev

SwiftはInitを介して複数のパラメーターを渡します

分類Dev

動的リンク関数jquery関数C#で複数のパラメーターを渡す方法は?

分類Dev

複数の文字列を単一の関数パラメータとして渡す

分類Dev

Scalaで、引数として複数のパラメーターリストを使用して関数を渡す方法は?

分類Dev

関数をパラメータとして別の関数に渡す方法は?

分類Dev

関数をパラメータとして別の関数に渡す方法は?

分類Dev

BeginInvoke()に複数のパラメーターを渡します

分類Dev

addTargetに複数のパラメーターを渡します

Related 関連記事

  1. 1

    WPFDataTriggerを介してMultivalueConverterで複数のパラメーターを渡す方法

  2. 2

    関数を介してSQLに複数のパラメーターを渡すVBA

  3. 3

    xargsを介して複数のパラメーターを渡す

  4. 4

    AJAXを介して複数のパラメーターをPHPに渡す

  5. 5

    FirebaseDynamicリンクAndroidを介して複数のパラメータを渡す

  6. 6

    Kotlinの関数を介して演算子パラメーターを渡す方法

  7. 7

    SQL関数に複数のパラメーターを渡す

  8. 8

    ラムダ関数で複数のパラメーターを渡して取得する方法は?

  9. 9

    複数のリスト値を関数パラメーターとして渡す方法は?

  10. 10

    web-apiを使用して複数のパラメーターを渡す方法

  11. 11

    複数の列をパラメーターとしてpysparkに渡す方法writerepartition()

  12. 12

    同じパラメータを複数の関数に渡す方法は?

  13. 13

    関数をJavaのパラメーターとして渡して、複数回実行する方法

  14. 14

    関数内のForループにパラメーターとして複数の配列を渡す

  15. 15

    Python:Pythonの方法で関数から関数に複数のパラメーターを渡す

  16. 16

    Javascript-CreateStore-複数の関数を1つのパラメーターとして渡す-Redux-ReactNative

  17. 17

    複数のクロージャをパラメータとしてswiftの関数に渡す

  18. 18

    関数へのパラメーターとして複数の配列を渡す

  19. 19

    $ .ajaxを使用して複数のパラメーターをPOSTでphp関数に渡す

  20. 20

    <s:url /> Struts2タグを介して複数のパラメーターを渡す

  21. 21

    PowerShellを介して複数のクエリパラメーターをWebServiceに渡します

  22. 22

    SwiftはInitを介して複数のパラメーターを渡します

  23. 23

    動的リンク関数jquery関数C#で複数のパラメーターを渡す方法は?

  24. 24

    複数の文字列を単一の関数パラメータとして渡す

  25. 25

    Scalaで、引数として複数のパラメーターリストを使用して関数を渡す方法は?

  26. 26

    関数をパラメータとして別の関数に渡す方法は?

  27. 27

    関数をパラメータとして別の関数に渡す方法は?

  28. 28

    BeginInvoke()に複数のパラメーターを渡します

  29. 29

    addTargetに複数のパラメーターを渡します

ホットタグ

アーカイブ