C# アプリケーションから EVE Online API にアクセスするためのフレームワークを開発しています。基本的に、API はクライアントが EVE Online サーバーに GET 要求を送信することによって機能し、サーバーは XML ファイルの形式で応答を送信します。私のフレームワークは、これらの XML ファイル内の情報をオブジェクトに解析します。リクエストからの情報は変更できません (つまり、クライアント側アプリケーションからサーバー データを変更する方法はありません)。このため、オブジェクト自体は不変でなければなりません。
さて、ここを見ると、すべてのリクエストで常に送信されるさまざまなフィールドがいくつかあることがわかります。たとえば、キャラクターのウォレット トランザクションをリクエストする場合は、次のようにリクエストします。
char/WalletTransactions
これは次のようなものを返します
<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
<currentTime>2010-12-10 22:10:45</currentTime>
<result>
<rowset name="transactions" key="transactionID" columns="transactionDateTime,transactionID,quantity,typeName,typeID,price,clientID,clientName,stationID,stationName,transactionType,transactionFor">
<row transactionDateTime="2010-11-24 20:33:00" transactionID="1625396969" quantity="2" typeName="Armor Plates" typeID="25605" price="314004.67" clientID="1429013925" clientName="DDV 77" stationID="60008992" stationName="Lisudeh IV - Moon 4 - Theology Council Tribunal" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-17 00:15:00" transactionID="1617616497" quantity="2393" typeName="Phased Plasma S" typeID="184" price="14.90" clientID="979676146" clientName="Kaihokohoko McIver" stationID="60001174" stationName="Lisudeh VI - Moon 2 - Kaalakiota Corporation Factory" transactionType="buy" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:58:00" transactionID="1613691673" quantity="1" typeName="Survey Scanner I" typeID="444" price="1113.09" clientID="90001413" clientName="Lucius Ventrell" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:57:00" transactionID="1613691609" quantity="2" typeName="Ship Scanner I" typeID="443" price="501.00" clientID="1612349330" clientName="Homer911" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:57:00" transactionID="1613691547" quantity="1" typeName="Rudimentary Ship Scanner I" typeID="6527" price="10.00" clientID="1551104262" clientName="Chloe TaTu" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:57:00" transactionID="1613691498" quantity="2" typeName="150mm Railgun I" typeID="565" price="5002.10" clientID="419113578" clientName="Rashim Xanadu" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:57:00" transactionID="1613691447" quantity="1" typeName="Small Hull Repairer I" typeID="524" price="14103.98" clientID="703468457" clientName="Orgazzmic" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:57:00" transactionID="1613691402" quantity="1" typeName="Dual Light Beam Laser I" typeID="452" price="3009.91" clientID="703468457" clientName="Orgazzmic" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:57:00" transactionID="1613691357" quantity="1" typeName="Small Nosferatu I" typeID="530" price="8106.77" clientID="703468457" clientName="Orgazzmic" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:56:00" transactionID="1613690953" quantity="4" typeName="Small Energy Transfer Array I" typeID="529" price="13511.27" clientID="703468457" clientName="Orgazzmic" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:56:00" transactionID="1613690800" quantity="7" typeName="Tripped Power Circuit" typeID="25598" price="90852.35" clientID="467910905" clientName="Galloway Gallegher" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
<row transactionDateTime="2010-11-13 05:56:00" transactionID="1613690762" quantity="1" typeName="Tangled Power Conduit" typeID="25594" price="275.83" clientID="1271418001" clientName="Garthmanx" stationID="60004516" stationName="Hek IV - Krusual tribe Bureau" transactionType="sell" transactionFor="personal" />
</rowset>
</result>
<cachedUntil>2010-12-10 22:25:45</cachedUntil>
</eveapi>
そして、私が必要とするオブジェクトは、各行のこれらのフィールド (transactionDateTime、transactionID、quantity、typeName、typeID、price、clientID、clientName、stationID、stationName、transactionType、transactionFor) をすべて持つ必要があるため、次のようになります。
public class WalletTransaction
{
public string TransactionDateTime { get; private set; }
public int TransactionID { get; private set; }
public int Quantity { get; private set; }
public string TypeName { get; private set; }
public int TypeID { get; private set; }
public decimal Price { get; private set; }
public int ClientID { get; private set; }
public string ClientName { get; private set; }
public int StationID { get; private set; }
public string StationName { get; private set; }
public Type TransactionType { get; private set; }
public Account TransactionFor { get; private set; }
public int JournalTransactionID { get; private set; }
public WalletTransaction(string transactionDateTime, int transactionID,
int quantity, string typeName, int typeID, decimal price, int clientID,
string clientName, int stationID, string stationName, Type transactionType,
Account transactionFor, int journalTransactionID)
{
TransactionDateTime = transactionDateTime;
TransactionID = transactionID;
Quantity = quantity;
TypeName = typeName;
TypeID = typeID;
Price = price;
ClientID = clientID;
ClientName = clientName;
StationID = stationID;
StationName = stationName;
TransactionType = transactionType;
TransactionFor = transactionFor;
JournalTransactionID = journalTransactionID;
}
public enum Type
{
Buy,
Sell
}
public enum Account
{
Personal,
Computer
}
}
ご覧のとおり、これは非常に大きなコンストラクターですが、XML ファイルから受け取ったすべての情報がなければ、オブジェクトは完全に初期化されません。このようなもので、このように動作する必要があるオブジェクトは他にもたくさんあります (不変で、さまざまなフィールドがあります)。
したがって、問題は次のようになります。オブジェクトは不変である必要があり、これらのさまざまなフィールドをすべて持つ必要があるため、コンストラクターを使用する必要がありますか? または、この場合はオブジェクト初期化子の方が優れており、サーバーに影響を与えないため、本当に必要な場合はセッターメソッドを呼び出させますか?