ইন্ট্রো
ঠিক আছে আমি দেখতে পাচ্ছি মজাদারির জন্য একটি সমাধান দেওয়া আছে, সুতরাং আমি মখারি পছন্দ না করায় আমি আপনাকে একটি ভবিষ্যদ্বাণী বিকল্প দিতে যাচ্ছি তবে আমি আপনাকে প্রথমে উপহাস এবং ভবিষ্যদ্বাণীটির মধ্যে পার্থক্য সম্পর্কে পড়ার পরামর্শ দিচ্ছি ।
দীর্ঘ গল্প সংক্ষিপ্ত : "ভবিষ্যদ্বাণী বার্তা বাঁধাই বলা পদ্ধতির ব্যবহার করে - এর অর্থ এই যে পদ্ধতির আচরণ সময়ের সাথে পরিবর্তিত হয় না, বরং অন্য পদ্ধতি দ্বারা পরিবর্তিত হয়।"
কভার রিয়েল ওয়ার্ল্ড সমস্যাযুক্ত কোড
class Processor
{
/**
* @var MutatorResolver
*/
private $mutatorResolver;
/**
* @var ChunksStorage
*/
private $chunksStorage;
/**
* @param MutatorResolver $mutatorResolver
* @param ChunksStorage $chunksStorage
*/
public function __construct(MutatorResolver $mutatorResolver, ChunksStorage $chunksStorage)
{
$this->mutatorResolver = $mutatorResolver;
$this->chunksStorage = $chunksStorage;
}
/**
* @param Chunk $chunk
*
* @return bool
*/
public function process(Chunk $chunk): bool
{
$mutator = $this->mutatorResolver->resolve($chunk);
try {
$chunk->processingInProgress();
$this->chunksStorage->updateChunk($chunk);
$mutator->mutate($chunk);
$chunk->processingAccepted();
$this->chunksStorage->updateChunk($chunk);
}
catch (UnableToMutateChunkException $exception) {
$chunk->processingRejected();
$this->chunksStorage->updateChunk($chunk);
// Log the exception, maybe together with Chunk insert them into PostProcessing Queue
}
return false;
}
}
পিএইচপিউনিট প্রফেসি সলিউশন
class ProcessorTest extends ChunkTestCase
{
/**
* @var Processor
*/
private $processor;
/**
* @var MutatorResolver|ObjectProphecy
*/
private $mutatorResolverProphecy;
/**
* @var ChunksStorage|ObjectProphecy
*/
private $chunkStorage;
public function setUp()
{
$this->mutatorResolverProphecy = $this->prophesize(MutatorResolver::class);
$this->chunkStorage = $this->prophesize(ChunksStorage::class);
$this->processor = new Processor(
$this->mutatorResolverProphecy->reveal(),
$this->chunkStorage->reveal()
);
}
public function testProcessShouldPersistChunkInCorrectStatusBeforeAndAfterTheMutateOperation()
{
$self = $this;
// Chunk is always passed with ACK_BY_QUEUE status to process()
$chunk = $this->createChunk();
$chunk->ackByQueue();
$campaignMutatorMock = $self->prophesize(CampaignMutator::class);
$campaignMutatorMock
->mutate($chunk)
->shouldBeCalled();
$this->mutatorResolverProphecy
->resolve($chunk)
->shouldBeCalled()
->willReturn($campaignMutatorMock->reveal());
$this->chunkStorage
->updateChunk($chunk)
->shouldBeCalled()
->will(
function($args) use ($self) {
$chunk = $args[0];
$self->assertTrue($chunk->status() === Chunk::STATUS_PROCESSING_IN_PROGRESS);
$self->chunkStorage
->updateChunk($chunk)
->shouldBeCalled()
->will(
function($args) use ($self) {
$chunk = $args[0];
$self->assertTrue($chunk->status() === Chunk::STATUS_PROCESSING_UPLOAD_ACCEPTED);
return true;
}
);
return true;
}
);
$this->processor->process($chunk);
}
}
সারসংক্ষেপ
আবার, ভবিষ্যদ্বাণী আরও দুর্দান্ত! আমার কৌশলটি হ'ল ভবিষ্যদ্বাণীটির বার্তাবাহক বাঁধার প্রকৃতিটি উত্তোলন করা এবং যদিও এটি দুঃখজনকভাবে একটি সাধারণ, কলব্যাক জাভাস্ক্রিপ্ট নরকের কোড হিসাবে দেখা যাচ্ছে, এটি $ স্ব = $ এর সাথে শুরু হয়েছে ; যেহেতু আপনাকে খুব কমই এরকম ইউনিট পরীক্ষা লিখতে হবে বলে আমি মনে করি এটি একটি দুর্দান্ত সমাধান এবং এটি অনুসরণ করা, ডিবাগ করা অবশ্যই সহজ, কারণ এটি প্রোগ্রামটির বাস্তবায়নটির বর্ণনা দেয়।
বিটিডব্লিউ: দ্বিতীয় বিকল্প রয়েছে তবে কোডটি যা আমরা পরীক্ষা করছি তা পরিবর্তন করা দরকার। আমরা সমস্যা সমাধানকারীদের গুটিয়ে রাখতে এবং তাদের একটি পৃথক শ্রেণিতে স্থানান্তর করতে পারি:
$chunk->processingInProgress();
$this->chunksStorage->updateChunk($chunk);
মোড়ানো হতে পারে:
$processorChunkStorage->persistChunkToInProgress($chunk);
এবং এটি কিন্তু তবে আমি এর জন্য অন্য একটি ক্লাস তৈরি করতে চাইনি, তাই আমি প্রথমটিকে পছন্দ করি।