PetaSoft Knowledge Base

Programming code style

/packages/Books/BooksAnalytics.php

<?php

	namespace Books;

	class BooksAnalytics {
		const MAX_BEST_POPULAR_ROWS = 10;


		/** @type Book[] */
		private $books;

		/** @type bool */
		private $wasListModified;

		/** @type Book[] */
		private $cachedMostPopular;


		/**
		 * @param Book[] $books
		 *
		 * @return void
		 */
		public function setBooks (array $books) {
			$this->books = $books;
			$this->wasListModified = false;
		}

		/**
		 * @return array
		 */
		public function getAnalyticsData () {
			return [
				"most_popular" => $this->getMostPopularBooks(),
				"last_loaded" => $this->getLastBooks(),
			];
		}

		/**
		 * @return Book[]
		 */
		public function getMostPopularBooks () {
			if ($this->wasListModified)
				return $this->cachedMostPopular;

			$downloads = [ ];
			foreach ( $this->books as $book )
				$this->modifyMostPopular($downloads, $book);

			$this->wasListModified = true;
			$this->cachedMostPopular = $downloads;

			return $this->cachedMostPopular;
		}

		/**
		 * @return Book[]
		 */
		public function getLastBooks () {
			$lastBooks = [ ];
			// ...
			return $lastBooks;
		}

		/**
		 * @return int
		 */
		public function getPublicationsCount () {
			return $this->selectBooksCount() + $this->selectMagazinesCount();
		}

		/**
		 * @param Book[] $downloads
		 * @param Book $book
		 *
		 * @return void
		 */
		private function modifyMostPopular (array &$downloads, Book $book) {
			if (count($downloads) > self::MAX_BEST_POPULAR_ROWS) {
				if ($this->hasBookMoreDownloadsThanOneFromList($downloads, $book)) {
					$this->sortBooksByDownloads($downloads);
					$downloads[ self::MAX_BEST_POPULAR_ROWS - 1 ] = $book;
				}
			} else {
				$downloads[] = $book;
			}
		}

		private function selectBooksCount () {
			return Book::selectTotalCountFromDb();
		}

		private function selectMagazinesCount () {
			$count = 0;
			// ...
			return $count;
		}

		/**
		 * @param Book[] $downloads
		 * @param Book $book
		 *
		 * @return bool
		 */
		private function hasBookMoreDownloadsThanOneFromList (array &$downloads, Book $book) {
			$n = count($downloads);
			$has = false;

			for ( $i = 0; $i < $n; $i ++ )
				if ($book->getDownloadsCount() > $downloads[ $i ]->getDownloadsCount())
					$has = true;

			return $has;
		}

		/**
		 * @param Book[] $downloads
		 *
		 * @return Book[]
		 */
		private function sortBooksByDownloads (array &$downloads) {
			$sortedByDownloads = $downloads;
			// ...
			return $sortedByDownloads;
		}
	}
	

/packages/Books/Book.php

<?php

    namespace Books;

    class Book {
        public static function selectTotalCountFromDb () {
            return self::selectTotalCountFromMySql();
        }

        public function getDownloadsCount () {
            $downloads = 0;
            // ...
            return $downloads;
        }

        private static function selectTotalCountFromMySql () {
			$count = 0;
			// ...
            return $count;
        }
    }