Created
April 20, 2024 17:27
-
-
Save samwightt/59d0eee6b10ee828b70456fb85760062 to your computer and use it in GitHub Desktop.
Asking Claude to write Hello World
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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