2

私は現在分散システムを調査しているので...私はそのIDLのことを学ばなければなりません。:D私にはこの要件があります:

IDLで定義-構造体としてのアカウント-アカウントのシーケンスとしてのアカウント-いくつかのアカウント操作を持つインターフェイス顧客: payIn(amount、accountId)、-成功した場合はtrueを返し、そうでない場合はfalse getAccounts(name)、-のシーケンスを返しますアカウント(個人に属する) -アカウント操作を行うインターフェイス管理者: 新しいアカウントを作成するアカウントを削除する

これは私の.idlファイルです:

module AccountNaming
{
    struct Account
    {
        long id;
        double balance;
        string name;    
    };

    typedef sequence<Account> accounts;

    interface Customer
    {
        boolean payIn(in double amount, in long accountId);
        accounts getAccounts(in string name);
        string helloCust();
    };
    interface Administrator
    {
        void createAcc();
        void deleteAcc();
        string helloAdmin();
    };
};

IDLのすべてのPOA、ヘルパー、ホルダークラスを生成しました。

私のJavaコードには、IDLコードを使用するクラスがあります。

import AccountNaming.*;
public class CustomerImpl extends CustomerPOA
{
   public String helloCust()
   {
      return "Hello, dear Customer! :) ";
   }

   @Override
   public boolean payIn(double amount, int accountId)
   {
      // how to get to the Customer's local variables ?
      super.Customer.setAmount... // or something like that, because this doesn't work... etc.
      return false;
   }

   @Override
   public Account[] getAccounts(String name)
   {
      // TODO Auto-generated method stub
      return null;
   }
}    

.idlファイルが正しいことを知っています。「helloCust/admin」メソッドは機能します。私の質問は、顧客/管理者の変数にアクセスして、payIn、getAccountsメソッドで引数として設定できるようにする方法です。

4

2 に答える 2

3

インターフェイスにアクセスできるようにファサードまたはファクトリを追加できるCustomer/Administratorため、IDL には以下も含まれます。

interface UserFactory 
{
   Customer getCustomer(String customerName);
   Administrator getAdministrator(String credentials); 
}

このインターフェースを実装すると、データベースなどから詳細を検索する必要があります。

nameこれを使用すると、(これがフィルタリングに使用されない限り)フィールドを必要としない可能性が高く、次のgetAccounts()ことができます。

Account[] accounts = getAccounts("not-needed-anymore");
for (Account account : accounts) {
   if (account.id == accountId) {
      account.balance += amount;
      break;
   }
}

これにより配列情報が更新されますAccountが、データ構造を保持する必要があります。

于 2012-11-04T15:30:30.033 に答える
-1

Reimeusさん、素早い回答をありがとう、しかし私はもっと簡単な解決策を考えました:

public boolean payIn(double amount, int accountNumber)
    {
        boolean success = false;
        for(int i = 0; i < accountList.length; i++)
        {
            if(accountList[i].accountNumber == accountNumber)
            {
                accountList[i].balance += amount;
                success = true;
            }
        }
        return success;
    }

    @Override
    public account[] getAccounts(String name)
    {
        account[] accounts;
        int numberOfAccounts = 0;
        int count = 0;
        for(int i = 0; i < accountList.length; i++)
        {
           if(accountList[i] != null)
            if(accountList[i].name.equalsIgnoreCase(name))
            {
                numberOfAccounts++;
            }
        }
        if(numberOfAccounts != 0)
        {
            accounts = new account[numberOfAccounts];
            for(int i = 0; i < accountList.length; i++)
            {
                if(accountList[i].name.equalsIgnoreCase(name))
                {
                    accounts[count] = accountList[i];
                    count++;
                }
            }
            return accounts;
        }
        else
        {
            return null;
        }

    }
于 2012-11-09T20:41:54.810 に答える