Skip to content

Instantly share code, notes, and snippets.

@samwightt
Created April 20, 2024 17:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samwightt/59d0eee6b10ee828b70456fb85760062 to your computer and use it in GitHub Desktop.
Save samwightt/59d0eee6b10ee828b70456fb85760062 to your computer and use it in GitHub Desktop.
Asking Claude to write Hello World
// I asked Claude to write Hello World. Then I continually asked it to extract new classes until we got the below.
// Introducing the world's most complicated Hello World program.
class Printable {
toString() {
throw new Error('toString() method must be implemented');
}
}
class MessageCreator {
createMessage() {
throw new Error('createMessage() method must be implemented');
}
}
class MessageCreatorFactory {
createMessageCreator() {
throw new Error('createMessageCreator() method must be implemented');
}
}
class TextMessageCreatorFactory extends MessageCreatorFactory {
createMessageCreator(text) {
return new TextMessageCreator(text);
}
}
class Logger {
log(message) {
throw new Error('log() method must be implemented');
}
}
class ConsoleLogger extends Logger {
log(message) {
console.log(message);
}
}
class FileLogger extends Logger {
constructor(filePath) {
super();
this.filePath = filePath;
}
log(message) {
// Code to log the message to a file at the specified file path
// (implementation omitted for brevity)
}
}
class LoggerFactory {
createLogger() {
throw new Error('createLogger() method must be implemented');
}
}
class ConsoleLoggerFactory extends LoggerFactory {
createLogger() {
return new ConsoleLogger();
}
}
class FileLoggerFactory extends LoggerFactory {
constructor(filePath) {
super();
this.filePath = filePath;
}
createLogger() {
return new FileLogger(this.filePath);
}
}
class LoggingService {
constructor(logger) {
this.logger = logger;
}
log(printable) {
this.logger.log(printable.toString());
}
}
class TextMessageCreator extends MessageCreator {
constructor(text) {
super();
this.text = text;
}
createMessage() {
return new Message(this.text);
}
}
class Message extends Printable {
constructor(text) {
super();
this.text = text;
}
toString() {
return this.text;
}
toGreeting() {
return new Greeting(this);
}
}
class Greeting extends Printable {
constructor(message) {
super();
this.message = message;
}
toString() {
return this.message.toString();
}
}
class GreetingService {
constructor(loggingService, greetingFormatter) {
this.loggingService = loggingService;
this.greetingFormatter = greetingFormatter;
}
greet(greeting) {
const formattedGreeting = this.greetingFormatter.format(greeting);
this.loggingService.log(formattedGreeting);
}
}
class GreetingServiceFactory {
createGreetingService(loggingService, greetingFormatter) {
return new GreetingService(loggingService, greetingFormatter);
}
}
class GreetingFormatter {
format(greeting) {
return greeting.toString();
}
}
class UppercaseGreetingFormatter extends GreetingFormatter {
format(greeting) {
return greeting.toString().toUpperCase();
}
}
class MessageFormatterFactory {
createMessageFormatter() {
throw new Error('createMessageFormatter() method must be implemented');
}
}
class UppercaseMessageFormatterFactory extends MessageFormatterFactory {
createMessageFormatter() {
return new UppercaseGreetingFormatter();
}
}
class GreetingDecorator {
constructor(greeting) {
this.greeting = greeting;
}
toString() {
return this.decorate(this.greeting.toString());
}
decorate(greetingString) {
throw new Error('decorate() method must be implemented');
}
}
class EmojiGreetingDecorator extends GreetingDecorator {
decorate(greetingString) {
return `😊 ${greetingString} 😊`;
}
}
class MessageDecoratorFactory {
createMessageDecorator(greeting) {
throw new Error('createMessageDecorator() method must be implemented');
}
}
class EmojiMessageDecoratorFactory extends MessageDecoratorFactory {
createMessageDecorator(greeting) {
return new EmojiGreetingDecorator(greeting);
}
}
class GreetingObserver {
onGreetingSent(greeting) {
console.log(`Greeting sent: ${greeting}`);
}
}
class GreetingCommand {
constructor(greeter, text) {
this.greeter = greeter;
this.text = text;
}
execute() {
this.greeter.greet(this.text);
}
}
class Greeter {
constructor(greetingService, messageCreatorFactory) {
this.greetingService = greetingService;
this.messageCreatorFactory = messageCreatorFactory;
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
removeObserver(observer) {
const index = this.observers.indexOf(observer);
if (index !== -1) {
this.observers.splice(index, 1);
}
}
notifyObservers(greeting) {
for (const observer of this.observers) {
observer.onGreetingSent(greeting);
}
}
greet(text) {
const messageCreator = this.messageCreatorFactory.createMessageCreator(text);
const message = messageCreator.createMessage();
const greeting = message.toGreeting();
const decoratedGreeting = new EmojiGreetingDecorator(greeting);
this.greetingService.greet(decoratedGreeting);
this.notifyObservers(decoratedGreeting.toString());
}
}
class GreeterFactory {
createGreeter(greetingService, messageCreatorFactory) {
return new Greeter(greetingService, messageCreatorFactory);
}
}
// Additional classes for reusability and code quality
class GreetingRepository {
constructor() {
this.greeting = 'Hello, World!';
}
getGreeting() {
return this.greeting;
}
}
class GreetingValidator {
isValid(greeting) {
return typeof greeting === 'string' && greeting.trim().length > 0;
}
}
class GreetingCache {
constructor() {
this.cache = new Map();
}
getGreeting(key) {
return this.cache.get(key);
}
setGreeting(key, greeting) {
this.cache.set(key, greeting);
}
}
class GreetingBuilder {
constructor() {
this.parts = [];
}
append(part) {
this.parts.push(part);
return this;
}
build() {
return this.parts.join(' ');
}
}
class GreetingDirector {
constructor(builder) {
this.builder = builder;
}
constructStandardGreeting() {
return this.builder.append('Hello,').append('World!').build();
}
}
class GreetingProxy {
constructor(greeter) {
this.greeter = greeter;
}
greet(text) {
console.log('Before greeting');
this.greeter.greet(text);
console.log('After greeting');
}
}
// ... (previous code remains the same)
class GreetingStrategy {
greet(greeting) {
throw new Error('greet() method must be implemented');
}
}
class SimpleGreetingStrategy extends GreetingStrategy {
greet(greeting) {
console.log(greeting);
}
}
class EntusiasticGreetingStrategy extends GreetingStrategy {
greet(greeting) {
console.log(`${greeting}!!!`);
}
}
class GreetingContext {
constructor(strategy) {
this.strategy = strategy;
}
setStrategy(strategy) {
this.strategy = strategy;
}
greet(greeting) {
this.strategy.greet(greeting);
}
}
class GreetingTemplate {
constructor(greeting) {
this.greeting = greeting;
}
render() {
return this.greeting;
}
}
class GreetingTemplateFactory {
createTemplate(greeting) {
return new GreetingTemplate(greeting);
}
}
class GreetingMediator {
constructor() {
this.colleagues = [];
}
addColleague(colleague) {
this.colleagues.push(colleague);
}
sendGreeting(greeting) {
for (const colleague of this.colleagues) {
colleague.receiveGreeting(greeting);
}
}
}
class GreetingColleague {
constructor(mediator) {
this.mediator = mediator;
}
sendGreeting(greeting) {
this.mediator.sendGreeting(greeting);
}
receiveGreeting(greeting) {
console.log(`Received greeting: ${greeting}`);
}
}
// Usage example
const consoleLoggerFactory = new ConsoleLoggerFactory();
const consoleLogger = consoleLoggerFactory.createLogger();
const loggingService = new LoggingService(consoleLogger);
const textMessageCreatorFactory = new TextMessageCreatorFactory();
const uppercaseMessageFormatterFactory = new UppercaseMessageFormatterFactory();
const greetingFormatter = uppercaseMessageFormatterFactory.createMessageFormatter();
const greetingServiceFactory = new GreetingServiceFactory();
const greetingService = greetingServiceFactory.createGreetingService(loggingService, greetingFormatter);
const greeterFactory = new GreeterFactory();
const greeter = greeterFactory.createGreeter(greetingService, textMessageCreatorFactory);
const greetingObserver = new GreetingObserver();
greeter.addObserver(greetingObserver);
const greetingRepository = new GreetingRepository();
const greetingValidator = new GreetingValidator();
const greetingCache = new GreetingCache();
const greetingBuilder = new GreetingBuilder();
const greetingDirector = new GreetingDirector(greetingBuilder);
const greeting = greetingDirector.constructStandardGreeting();
if (greetingValidator.isValid(greeting)) {
const cachedGreeting = greetingCache.getGreeting(greeting);
if (cachedGreeting) {
console.log(`Using cached greeting: ${cachedGreeting}`);
} else {
const greetingProxy = new GreetingProxy(greeter);
greetingProxy.greet(greeting);
greetingCache.setGreeting(greeting, greeting);
}
const simpleGreetingStrategy = new SimpleGreetingStrategy();
const entusiasticGreetingStrategy = new EntusiasticGreetingStrategy();
const greetingContext = new GreetingContext(simpleGreetingStrategy);
greetingContext.greet(greeting);
greetingContext.setStrategy(entusiasticGreetingStrategy);
greetingContext.greet(greeting);
const greetingTemplateFactory = new GreetingTemplateFactory();
const greetingTemplate = greetingTemplateFactory.createTemplate(greeting);
console.log(greetingTemplate.render());
const greetingMediator = new GreetingMediator();
const colleague1 = new GreetingColleague(greetingMediator);
const colleague2 = new GreetingColleague(greetingMediator);
greetingMediator.addColleague(colleague1);
greetingMediator.addColleague(colleague2);
colleague1.sendGreeting(greeting);
} else {
console.log('Invalid greeting');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment