Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ДСфрагмСнтация ΠΌΠΎΠ·Π³Π°. БофтостроСниС ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 16

Автор Π‘Π΅Ρ€Π³Π΅ΠΉ Варасов

Говоря ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, я имСю Π² Π²ΠΈΠ΄Ρƒ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ отсутствиС сравнимой с CORBA Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π½ΠΎΠΌΠ΅Π½ΠΊΠ»Π°Ρ‚ΡƒΡ€Ρ‹ слуТб ΠΈ срСдств[80], сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ программистам самим Π½Π°Π΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½Π°Π΄ этим базисом ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π΄Π°ΠΆΠ΅ Π² самом минимальном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ CORBA.

Π’Π΅Π±, Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π΅Π³ΠΎ основа, HTTP – срСда Π±Π΅Π· состояния ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сСссий. Π’ общСдоступном Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ сообраТСниями Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ максимальноС число запросов ΠΊ сСрвСру тСорСтичСски Ρ€Π°Π²Π½ΠΎ количСству всСх устройств Π² сСти. Π’ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΆΠ΅ систСмС Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° слуТбу ΠΌΠΎΠΆΠ½ΠΎ (ΠΈ Π½ΡƒΠΆΠ½ΠΎ) Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ‚ΠΎΡ‡Π½Π΅Π΅. Π’ ΠΈΡ‚ΠΎΠ³Π΅ программистам, Π½Π΅ связанным с Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ для Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°, приходится Π²ΠΎΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСдостаток срСдств ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° надстройками ΠΏΠΎΠ²Π΅Ρ€Ρ… Π½Π΅Π³ΠΎ костылСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, постоянно гоняя контСкст ΠΈ состояниС Π² сообщСниях ΠΈΠ»ΠΈ симулируя сСссии ΠΏΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρƒ.

Π’ CORBA сСссии ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΈΡΡŒ срСдой Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… усилий. Если Π² частных случаях Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ вопросы Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ соСдинСний ΠΏΡ€ΠΈ большом количСствС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΎΠ½ΠΈ Ρ€Π΅ΡˆΠ°Π»ΠΈΡΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ просто, ΠΊΠ°ΠΊ ΠΈ Π² срСдС Π‘Π£Π‘Π”: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ»ΠΎΡΡŒ ΠΎΡ‚ сСрвСра, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… запросов. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π±Ρ‹Π»ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ отсоСдинСниС ΠΏΠΎ истСчСнии Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° пассивности. Но для ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ слуТбы, напомню, Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎ дСсятках ΠΈ сотнях Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… сСссий, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв укладываСтся Π² рСсурсы сСрвСров.

НСприятным слСдствиСм отсутствия сСссий стала Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π²Π΅Π±-слуТбами. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ООП Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ шаблон Β«Π•Π΄ΠΈΠ½ΠΈΡ†Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹Β» (unit of work), ΡΡƒΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π²Π΅Π±-слуТбС сразу всСго упорядочСнного мноТСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ Π² управляСмой сСрвСром Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС шаблон являСтся Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ для сокращСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. НапримСр, Π² Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π‘Π£Π‘Π” сиквСл-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ‡ΠΊΠ°ΠΌΠΈ. Но Ссли Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π±Ρ‹Π» Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ срСдством избавлСния ΠΎΡ‚ толстых Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всСгда, вмСсто любой Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сравним Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ псСвдокод Π½Π° сторонах ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… CORBA с псСвдокодом Π² срСдС Π²Π΅Π±-слуТб. ΠŸΡ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ сСссии всС достаточно ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΠΈ Π½Π΅ нуТдаСтся Π² коммСнтариях.


ПсСвдокод Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² срСдС CORBA

CosTransactions.Current current = CosTransactions.CurrentHelper.Narrow(

orb.ResolveInitialReferences("TransactionCurrent"));

current.Begin();

try

{

store1.Remove(product, quantity);

store2.Append(product, quantity);

current.Commit();

}

catch (Exception e)

{

current.Rollback();

ShowError("Ошибка выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: " + e.toString());

}


Π’ срСдС Π²Π΅Π±-слуТб Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ приходится Π½Π°Π΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ абстракции DTO[81]. А Π² сСрвСрном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ соСдинСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с Π‘Π£Π‘Π” ΠΈΠ»ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ фактичСски Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ с раскруткой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° – Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ (unit of work) Π² Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.


ПсСвдокод Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² срСдС Π²Π΅Π±-слуТб

StoreServiceClient storeServiceClient = new StoreServiceClient(url);

StoreOperationDTO operation1 = storeServiceClient.CreateOperation(store1.Id);

operation1.Type = StoreOperations.Remove;

operation1.ProductId = product.Id;

operation1.Quantity = quantity;

StoreOperationDTO operation2 = storeServiceClient.CreateOperation(store2.Id);

operation2.Type = StoreOperations.Append;

operation2.ProductId = product.Id;

operation2.Quantity = quantity;


UnitOfWork uow = new UnitOfWork();

uof.RegisterDirty(operation1);

uof.RegisterDirty(operation2);

try

{

storeServiceClient.ProcessOperations(uow);

}

catch (Exception e)

{

ShowError("Ошибка выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: " + e.toString());

}


Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ Β«ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ΠΌΒ» стал ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ понятных ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΌΡƒ программисту Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΉ интСрфСйсов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ слуТб Π½Π° языкС IDL[82] ΠΊ WSDL[83] – описаниям, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ. Π‘Ρ€Π°Π²Π½ΠΈΠΌ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ складской слуТбы, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎ запросу Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ количСство Ρ‚ΠΎΠ²Π°Ρ€Π½Ρ‹Ρ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ.


ДСкларация слуТбы Π² CORBA IDL

module StockServices

{

typedef float CurrentQuantity;

struct QuantityRequest

{

string stockSymbol;

};

interface StockInventoryService

{

CurrentQuantity getCurrent(in QuantityRequest request);

};

};


ДСкларация слуТбы Π² WSDL

<?xml version="1.0" encoding="utf-8"?>

<definitions name="StockInventoryService"

xmlns: sqs="http://mycompany.com/stockinventoryservice.wsdl"

xmlns: sqsxsd="http://mycompany.com/stockinventoryservice.xsd"

xmlns: soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns: wsdl="http://schemas.xmlsoap.org/wsdl/"

xmlns: xsd="http://www.w3.org/2000/10/XMLSchema">

<wsdl: types>

<xsd: element name="CurrentQuantity">

<xsd: complexType>

<xsd: all>

<xsd: element name="stockSymbol" type="string"/>

</xsd: all>

</xsd: complexType>

</xsd: element>

<xsd: element name="CurrentQuantity">

<xsd: complexType>

<xsd: all>

<xsd: element name="quantity" type="float"/>

</xsd: all>

</xsd: complexType>

</xsd: element>

</wsdl: types>


<xsd: element name="CurrentQuantity">

<xsd: complexType>

<xsd: all>

<xsd: element name="quantity" type="float"/>

</xsd: all>

</xsd: complexType>

</xsd: element>

</wsdl: types>

<wsdl: message name="getCurrentInput">

<wsdl: part name="body" element="sqsxsd: CurrentQuantity"/>

</wsdl: message>


<wsdl: message name="getCurrentOutput">

<wsdl: part name="body" element="sqsxsd: CurrentQuantity"/>

</wsdl: message>

<wsdl: portType name="StockInventoryServicePortType">

<wsdl: operation name="getCurrent">

<wsdl: input message="sqs: getCurrentInput"/>

<wsdl: output message="sqs: getCurrentOutput"/>

</wsdl: operation>

</wsdl: portType>


<wsdl: binding name="StockInventoryServiceSoapBinding"

type="sqs: StockInventoryServicePortType">

<soap: binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl: operation name="getCurrent">

<soap: operation soapAction="http://mycompany.com/getCurrent"/>

<wsdl: input>

<soap: body use="literal"/>

</wsdl: input>

<wsdl: output>

<soap: body use="literal"/>

</wsdl: output>

</wsdl: operation>

</wsdl: binding>


<wsdl: service name="StockInventoryService">

<wsdl: port name="StockInventoryServicePort"

binding="sqs: StockInventoryServiceBinding">

<soap: address location="http://mycompany.com/StockInventoryService"/>

</wsdl: port>

</wsdl: service>

</definitions>


Π’Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Β«ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌΒ» стал ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ автоматичСской ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΊΠΈ связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²[84] Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ управлСния процСссом.

Π’ CORBA ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° сСрвСрС, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ находится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π·Π°Π³Π»ΡƒΡˆΠΊΠ° (stub). Π’ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π° Π½Π° самом Π΄Π΅Π»Π΅ происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру, Π²Ρ‹Π·ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρƒ сСрвСрного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ состояния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ. Аналогично со свойствами ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°: связанный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ подгруТаСтся ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. Всё это происходит ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ для программиста, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² процСсс взаимодСйствия, Π½ΠΎ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ стоит Π·Π° манипуляциями с Π·Π°Π³Π»ΡƒΡˆΠΊΠΎΠΉ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅. БоотвСтствСнно, сущСствуСт соблазн вмСсто Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° сСрвСрС Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слуТбы Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ нСпосрСдствСнно Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅, Π±Π»Π°Π³ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π»Π΅Π³ΠΊΠΎ. Π’ΠΎΠ³Π΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° достаточно большой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ интСнсивный ΠΎΠ±ΠΌΠ΅Π½ сообщСниями с сСрвСром ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΡƒΠ·ΠΊΠΎΠ³ΠΎ мСста Π² систСмС. Аналогичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠ»ΠΎΡ…ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ имССтся ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ прилоТСния Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с Π‘Π£Π‘Π”.

Π’ срСдС Π²Π΅Π±-сСрвисов вопрос с Β«Π½Π΅Ρ€Π°Π΄ΠΈΠ²Ρ‹ΠΌ программистом» Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ – ΠΎΡ‚ΠΌΠ΅Π½ΠΎΠΉ самой возмоТности Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π² 80 % случаСв имСвшаяся автоматичСская Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π±Ρ‹Π»Π° умСстной ΠΈ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ сокращала ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Как ΡƒΠ±Π΅Ρ€Π΅Ρ‡ΡŒ ΠΊΡƒΠΊΡƒΡ€ΡƒΠ·Ρƒ ΠΎΡ‚ насСкомых-Π²Ρ€Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΉ? ΠžΡ‡Π΅Π½ΡŒ просто: Π²Ρ‹ΠΊΠΎΡΠΈΡ‚ΡŒ Π΅Ρ‘ всю, ΠΊ чСртям. Π’Ρ€Π΅Π΄ΠΈΡ‚Π΅Π»ΠΈ ΠΏΡ€ΠΈΠ΄ΡƒΡ‚, Π° ΠΊΡƒΡˆΠ°Ρ‚ΡŒ Π½Π΅Ρ‡Π΅Π³ΠΎ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π²Π΅Π±-слуТбами ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ связаны с сСрвСрными Π·Π° ΠΈΡ… отсутствиСм. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ сСрвСрной части прилоТСния Π½Π΅Ρ‚ состояния ΠΈ, соотвСтствСнно, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅. ОбмСн сообщСниями происходит ΠΊΠ°ΠΊ ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π²Π΅Π±-срСдС: запрос – ΠΎΡ‚Π²Π΅Ρ‚ Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ сСссии. ΠžΠ±Ρ‰Π΅ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° – использованиС DTO для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Но DTO Π½Π΅ содСрТит Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ссылок Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ…. Π•Π³ΠΎ структура состоит ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ скалярных Ρ‚ΠΈΠΏΠΎΠ², Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Ρ… стандартом, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ массивов. БоотвСтствСнно, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ динамичСски ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, для Ρ‡Π΅Π³ΠΎ придётся явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ слуТбу.


ΠŸΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² клиСнтском CORBA-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

BookGroup group = catalog.getBookCategory("ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅");

Book[] books = group.getItems(); // ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² сСрвСра

foreach(Book book in books)

{

ShowInfo(book.Name +": ");

ShowInfo(book.getPopularity(). getVotesCount()); // Π΄Π²Π° Π²Ρ‹Π·ΠΎΠ²Π°

}


Π Π°Π±ΠΎΡ‚Π° клиСнтского прилоТСния с DTO Π² срСдС Π²Π΅Π±-слуТб

BookGroupServiceClient groupClient = new BookGroupServiceClient(url1);

BookGroupDTO group = groupClient.GetBookCategory("ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅");