THẢO LUẬN

câu trả lời đang được update lên dần r nha bác

0

câu trả lời đang được update lên dần r nha bác

0
thg 9 25, 9:08 SA

Như này vẫn chưa giải quyết được vấn đề ghi dữ liệu đúng không anh? Trong 1 cụm K8s có master có thể ghi data. Nếu phân tải ra các VPS khác nhau thì việc ghi dữ liệu cũng phải thao tác vào Master. Nếu thế thì phải làm thế nào khi Concurrency quá cao vậy anh? Cảm ơn anh vì bài viết chi tiết và dễ hiểu.

0
thg 9 25, 8:27 SA

@Tafi Khá hiếm gặp Builder trong thực tế, và cũng ít trường hợp có thể áp dụng. Nếu không hiểu rõ Builder thì có thể gặp phải cái goi là quan liêu trong thiết kế. Cá nhân thì tôi cũng không chắc việc dùng Builder trước đây có ok không. Nhưng có một số dấu hiệu khi dùng Builder:

  • Constructing phức tạp.
  • Constructor + Factory Method không thỏa mãn.
  • Product object gần như immutable.

Một vài ví dụ tìm được:

  1. UrlBuilder

Đây là Builder đơn giản gặp cả trong Java và .Net. UrlBuilder mạnh hơn constructor + Factory nhờ:

  • Khả năng tùy biến đơn giản hơn (absolute, relative url, query params, protocols).
  • Hạn chế lỗi (chẳng may kết xuất url khi chưa đủ thông tin).
  • Kết quả sau cuối là string - immutable.
  1. HostBuilder (WebHostBuilder)

Cái này bên .Net, tìm bên Java Springboot không có cái nào trùng tên (nhưng có thể có cái cùng chức năng mà không biết).

HostBuilder cung cấp nhiều giao diện để config một Host trước khi chạy. Điều này constructor và Factory khó có thể cung cấp (hoặc để cung cấp cần quá nhiều parameters, overloading).

Kết quả coi như immutable (Host sau khi build sẽ chạy suốt runtime)

  1. ReportBuilder

Cái này thì implement trước đây, cung cấp các giao diện buildHeader, Body, Footer, kết xuất cuối cùng là xml hoặc html. Dùng builder khác gì so với report.AddHeader(), report.AddBody()...?

  • Hạn chế lỗi không mong muốn (render report khi chưa đủ các thành phần)
  • Chia nhỏ các bước để giảm độ phức tạp cũng như tăng khả năng tái sử dụng.

Kết quả cuối cùng cũng là immutable (xml string, html string).

Cách này có vẻ dễ gặp trong thực tế khi xử lý các bài toán convert từ một dạng này sang một dạng khác. Các cái tên liên quan như Parser, Renderer. Bắt buộc phải qua nhiều bước xử lý để có kết quả cuối cùng nên constructor, Factory không tham gia được. Kết quả cuối cùng cũng có thể coi là immutable khi không còn nhu cầu xử lý trên nó nữa.

+1

@ManhNguyen98 ầu sết, thanks e đã phát hiện 🙏

0
thg 9 25, 7:14 SA

Chào A ! A cho e hỏi, khi em cài Plugin như vậy, mình click mà chữ danh mục đã tạo thì nó ko show ra bài viết danh mục đó,thì có cách nào show ra không a ?

0
thg 9 25, 7:11 SA

Hi ! Cảm ơn bạn rất nhiều nha,chắc sắp tới ổn nhờ 1 đội code về làm luôn ak

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 9 25, 6:47 SA

@nourist

//#include <cstdint>
//#include <time.h>
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double

const int limit = 1e8 + 8;

namespace bitsetSieve {
	uint64_t p[limit / 64 + 11];

	bool test(int idx) {
		return (p[idx / 64] & (1ULL << (idx % 64))) == 0;
	}

	void mark(int idx) {
		p[idx / 64] |= (1ULL << (idx % 64));
	}

	void sieve() {
		mark(0);
		mark(1);
		for (int i = 3; i * i < limit; i += 2) {
			if (test(i)) {
				for (int j = i * i; j < limit; j += i * 2) {
					mark(j);
				}
			}
		}
	}
}

namespace bitsetSieve2 {
	uint32_t p[limit / 32 + 11];

	bool test(int idx) {
		return (p[idx >> 5] & (1 << (idx % 32)));
	}

	void mark(int idx) {
		p[idx >> 5] &= ~(1 << (idx % 32));
	}

	void sieve() {
		const uint32_t bit1 = ~0;
		memset(p, bit1, sizeof p);
		p[0] = bit1 - 3;
		register uint32_t* pointer = bitsetSieve2::p;
		for (int i = 3; i * i < limit; i += 2) {
			register int i2 = i % 32;
			if(i2 == 1) {
				++pointer;
			}
			if ((*pointer) & (1 << i2)) {
				for (int j = i * i; j < limit; j += i * 2) {
					p[j >> 5] &= ~(1 << (j % 32));
				}
			}
		}
	}
}

namespace boolSieve {
	bool p[limit];
	
	void sieve() {
		memset(p, 1, sizeof p);
		p[0] = p[1] = 0;
		for (int i = 3; i * i < limit; i += 2) {
			if (p[i]) {
				for (int j = i * i; j < limit; j += i * 2) {
					p[j] = 0;
				}
			}
		}
	}
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	clock_t start = clock();
	boolSieve::sieve();
	cout << "bool sieve: " << clock() - start <<"ms"<< endl;

	start = clock();
	bitsetSieve2::sieve();
	cout << "bitset sieve: " << clock() - start <<"ms"<< endl;

	for(register int i=0; i<limit; ++i) {
		if(boolSieve::p[i] != bitsetSieve2::test(i)) {
			cout << i << " - Error! " << endl;
			break;
		}
	}

	return 0;
}

Nếu sửa lại để dùng 32bit thì nhanh hơn này

Output:

bool sieve: 1207973ms

bitset sieve: 726665ms

Link test: https://onecompiler.com/cpp/42t7s5m7j

0
thg 9 25, 4:39 SA

Builder có giá trị khi buildPart là một hàm phức tạp. Các phần code ví dụ lại quá đơn giản, cuối cùng lại call constructor của Product nên không thể hiện được ý nghĩa của Builder.
=> Tôi cũng cân nhắc làm ví dụ phức tạp nhưng trong nội dung bài viết thì tôi ưu tiên viết ngắn gọn tránh việc anh em khó đọc, khó theo dõi
=> Đoạn call constructor tôi chưa hiểu, bro cho tôi 1 ví dụ để hiểu rõ hơn cách bro implement builder. Quan điểm của tôi là constructor thì vẫn phải gọi, quạn trọng là gọi ở chỗ nào thôi.

Một tác dụng khác của Builder là không cần phải tạo đối tượng ngay lập tức mà có thể chia ra thành nhiều bước, khi các yếu tố hội tụ mới cần build hoàn chỉnh. Các bước có thể phụ thuộc vào nhau để tránh sai sót.
=> Đồng ý

Điều gì khác nhau giữa dùng Car Builder.BuildVF3() so với new VF3() : Car()? Điều gì khác nhau giữa Builder và Factory?
=> Vấn đề cần giải quyết của 2 pattern là khác nhau, tôi ko thấy sự liên quan, tuỳ vào nhu cầu cần sử dụng mà áp dụng. Ví dụ, cần nhiều step phức tạp để tạo ra product thì dùng builder, factory ko có vai trò gì trong TH này

Không rành về Java nhưng private constructor thì làm cách nào new được object đấy nhỉ?
=> Ý đồ là ép caller phải gọi thông qua builder nhưng cuối cùng thì vẫn phải có chỗ nào đấy gọi new Car(). Mà constructor set về private, không gọi được new từ bên ngoài nên mới cần đưa class CarBuilder vào làm nested class bên trong Car.

0

@maitrungduc1410 a ơi ở section Vite - Vue bị thiếu tạo file src/loader.ts ạ

0
thg 9 25, 3:17 SA

Builder có giá trị khi buildPart là một hàm phức tạp. Các phần code ví dụ lại quá đơn giản, cuối cùng lại call constructor của Product nên không thể hiện được ý nghĩa của Builder.

Một tác dụng khác của Builder là không cần phải tạo đối tượng ngay lập tức mà có thể chia ra thành nhiều bước, khi các yếu tố hội tụ mới cần build hoàn chỉnh. Các bước có thể phụ thuộc vào nhau để tránh sai sót.

Điều gì khác nhau giữa dùng Car Builder.BuildVF3() so với new VF3() : Car()? Điều gì khác nhau giữa Builder và Factory?

Không rành về Java nhưng private constructor thì làm cách nào new được object đấy nhỉ?

0

Thanh toán qua cổng thanh toán hoặc ví điện tử thì các bên dịch vụ này cung cấp api. Hiện nay thường thấy là dùng dịch vụ của momo đã có, còn vnpay thì chưa rõ hỗ trợ đến mức nào. Làm trực tiếp với ngân hàng thì tùy ngân hàng, họ sẽ cung cấp gói API riêng cho doanh nghiệp nhỏ hay không. Làm việc với các bên cổng thanh toán hay ví điện tử thì dễ hơn vì họ có đội ngũ bán lẻ để hỗ trợ. Ngân hàng thì phải tìm hiểu trước các sản phẩm của họ xem họ cung cấp không. Các gói sản phẩm phục vụ doanh nghiệp nhỏ hoặc cá nhân sẽ có bộ phận phụ trách và hỗ trợ, tư vấn khách hàng.

0

@QuangofG Quan trọng là nó hỗ trợ split cửa sổ, chia tab, tạo profile,... còn đẹp thì tuỳ mắt mỗi người

+1

@tanjiro2406 thanks bác

0
thg 9 24, 9:14 SA

@QuangofG Bài viết rất bổ ích

+1

lót dép hóng nhé e 😂

+1

👏 bài viết hay quá ạ. Hy vọng có thêm bài deploy MFE trong series này ạ

+1

cảm ơn bạn

0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí