(jp) =
これは、広告が表示される場所です。 代わりに、私の GitHub スポンサー ページを紹介したいと思います。 あなたが定期的な読者で、私のコンテンツが役に立っている場合は、1 回限りまたは毎月のスポンサーシップを検討できます。 このブログまたは私のニュースレターで専用の広告掲載を探している企業の方は、[email protected] までメールでお問い合わせください。
初めて見たときは奇妙に見えると思いますが、ちょっと聞いてください。私はコード フォルダーです。
class TwitterSyncCommand extends Command
protected $signature = 'twitter:sync --clean';
private Collection $mutes;
public function handle(Twitter $twitter)
public function syncFromList(Twitter $twitter): void
public function syncFromSearch(Twitter $twitter): void
private function storeTweets(array $tweets, TweetFeedType $feedType): void
private function shouldBeRejected(Tweet $tweet): ?RejectionReason
ほとんどの場合、ほとんどのコードを非表示にします。 コード ブロックを簡単に表示および非表示にするためのキーボード ショートカットがあります。 ファイルを開くと、すべてのメソッドと関数の本体がデフォルトで折りたたまれています。
理由? 私は、数十行のコードを一目で理解できる超人的なスピードリーダーではありません。 そして… 高さ 2 メートルのスクリーンもありません。
私はこれをすべて読んで理解することはできません—知っていますか?
class TwitterSyncCommand extends Command
{
protected $signature = 'twitter:sync --clean';
private Collection $mutes;
public function handle(Twitter $twitter)
$this->mutes = Mute::query()->select('text')->get();
if ($this->option('clean'))
$this->error('Truncating tweets!');
Tweet::truncate();
$this->syncFromSearch($twitter);
$this->syncFromList($twitter);
$this->info('Done');
public function syncFromList(Twitter $twitter): void
do
$lastTweet = Tweet::query()
->where('feed_type', TweetFeedType::LIST)
->orderByDesc('tweet_id')
->first();
$tweets = $twitter->request('lists/statuses.json', 'GET', [
'list_id' => config('services.twitter.list_id'),
'since_id' => $lastTweet?->tweet_id,
'count' => 200,
'tweet_mode' => 'extended',
]);
$count = count($tweets);
if ($count === 0)
$this->comment('No more new tweets');
else
$this->comment("Syncing $count tweets from list");
$this->storeTweets($tweets, TweetFeedType::LIST);
while ($tweets !== []);
public function syncFromSearch(Twitter $twitter): void
do
$lastTweet = Tweet::query()
->where('feed_type', TweetFeedType::SEARCH)
->orderByDesc('tweet_id')
->first();
$tweets = $twitter->request('/search/tweets.json', 'GET', [
'q' => 'phpstorm',
'since_id' => $lastTweet?->tweet_id,
'count' => 200,
'tweet_mode' => 'extended',
])->statuses;
$count = count($tweets);
if ($count === 0)
$this->comment('No more new tweets');
else
$this->comment("Syncing $count tweets from search");
$this->storeTweets($tweets, TweetFeedType::SEARCH);
while ($tweets !== []);
private function storeTweets(array $tweets, TweetFeedType $feedType): void
foreach ($tweets as $tweet)
$subject = $tweet->retweeted_status ?? $tweet;
$tweet = Tweet::updateOrCreate([
'tweet_id' => $tweet->id,
], [
'state' => TweetState::PENDING,
'feed_type' => $feedType,
'text' => $subject->full_text ,
'user_name' => $subject->user->screen_name,
'retweeted_by_user_name' => isset($tweet->retweeted_status)
? $tweet->user->screen_name
: null,
'created_at' => Carbon::make($subject->created_at),
'payload' => json_encode($tweet),
]);
if ($reason = $this->shouldBeRejected($tweet))
$tweet->update([
'state' => TweetState::REJECTED,
'rejection_reason' => $reason->message,
]);
(new ParseTweetText)($tweet);
private function shouldBeRejected(Tweet $tweet): ?RejectionReason
if ($tweet->isRetweet() && $tweet->feed_type === TweetFeedType::SEARCH)
return RejectionReason::retweetedFromSearch();
foreach ($this->mutes as $mute)
if ($tweet->containsPhrase($mute->text))
return RejectionReason::mute($mute->text);
if ($tweet->getPayload()->in_reply_to_status_id)
return RejectionReason::isReply();
if (str_starts_with($tweet->text, '@'))
return RejectionReason::isMention();
$language = $tweet->getPayload()->lang;
if ($language !== 'en')
return RejectionReason::otherLanguage($language);
return null;
}
特に 1 つの特定のメソッドを検索しているときは、そのコードをすべて見ると圧倒されます。
今、新しいファイルを作成すると、すべて問題なく、白紙の状態で、制御できます。 しかし、コードは急速に成長し、実際のプロジェクトでは白紙の状態ではなく、既存のファイルに作業が含まれることが多くなっています。 ですから、認知負荷を軽減する方法が本当に必要です。「一度にすべてを理解する」ことはできません。 だからこそ、私はコードの折りたたみがとても好きになりました。
慣れるまで1週間はかかります。 メソッド本体と関数を自動的に折りたたむように IDE を構成し、適切なキー バインドを割り当ててブロックを表示および非表示にします。 私はあなたに約束します、あなたはそれを好きになるでしょう。